Problemet med BULK INSERT plager os stadig - med endnu flere mystiske
opførsler.
I vores oprindelige setup lavede vi en SQL-string i vores .Net-lag,
som vi sendte til SQL-server og afviklede. Vi opbyggede SQL som
[*]
sqlCommand = String.Format("BULK INSERT {0} FROM '{1}' WITH (CODEPAGE = 'RAW', DATAFILETYPE = 'widechar', FIRSTROW = 1, KEEPIDENTITY, KEEPNULLS, ROWTERMINATOR = '\n', FIELDTERMINATOR = '\t')", TableName, FileName);
Når vi sendte den til SQL-server, så puttede den fint data ind i
databasen.
Så langt så godt.
Nu har vi flyttet ovenstående ind i en stored procedure, og den ser
således ud:
CREATE proc BMBulkInsertJobIntoTable
(
@TableName varchar(255),
@FileName varchar(255)
)
as
DECLARE @cmd varchar(1000)
SET @cmd = 'BULK INSERT ' + @TableName + ' FROM ''' + @FileName + ''' WITH (CODEPAGE = ''RAW'', DATAFILETYPE = ''widechar'', FIRSTROW = 1, KEEPIDENTITY, KEEPNULLS, FIELDTERMINATOR = ''\t'')'
EXEC(@cmd)
GO
Men når vi nu afvikler denne stored procedure, så kan den ikke længere
kende linieadskilleren (\n) og kommer med fejlen
Bulk insert data conversion error (type mismatch) for row 1, column 26
(vi har også prøvet at skrive '\r\n')
Hvis der kun er en enkelt linie i filen, så er der ingen problemer,
men så snart der er mere end én linie i filen, så går det galt. Vi har
prøvet både at lade ROWTERMINATOR være specificeret til '\n' og vi har
prøvet at lade den bruge default-værdien, men lige meget hjælper det.
Og det mest mystiske:
Hvis jeg lader vores program afvikle SQL-string [*] ovenfor, så går
det godt ... men hvis jeg debugger mig igennem koden og bruger
værdien - der sendes til SQL-server - men i stedet c/p'er den ind i
QA, så får jeg samme fejl med type mismatch.
Hvilken del af SQL-servers forunderlige verden er det, som vi
ikke forstår? Jeg vil tro, at problemet ligger i overførslen af '\n' og
'\t', så er der en alternativ måde, hvorpå vi kan sende
en NewLine/tab karakter ned til SQL-server? 0x10 0x13 eller noget
i den retning?
--
Jesper Stocholm
http://stocholm.dk
<a href="
http://www.sony.com">evil
Findes din kiosk på nettet? Se
http://ekiosk.dk