/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MSSQL] Newline i stored procedure
Fra : Jesper Stocholm


Dato : 18-11-05 08:03

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

 
 
Peter Lykkegaard (18-11-2005)
Kommentar
Fra : Peter Lykkegaard


Dato : 18-11-05 08:21

"Jesper Stocholm" wrote

> 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
>
DECLARE @cmd nvarchar(1000)
SET @cmd = N'BULK INSERT ' @TableName +
N' FROM ''' + @FileName +
N''' WITH (CODEPAGE = ''RAW'',
DATAFILETYPE = ''widechar'',
FIRSTROW = 1,
KEEPIDENTITY,
KEEPNULLS,
FIELDTERMINATOR = ''\t'')'
EXEC(@cmd)
GO

Du kan bruge NVarChar i stedet for VarChar sammen med Exec (Jeg har haft
problemer med VarChar)
Hvor blev rowterminator af?

Du kan evt kikke på widenative (BOL) hvis data kommer fra en anden sql
server vha bcp værktøjet

- Peter



Jesper Stocholm (18-11-2005)
Kommentar
Fra : Jesper Stocholm


Dato : 18-11-05 08:52

"Peter Lykkegaard" <plykkegaard@gmail.com> wrote in
news:437d80e6$0$99989$edfadb0f@dread16.news.tele.dk:

> "Jesper Stocholm" wrote
>
>> 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
>>
> DECLARE @cmd nvarchar(1000)
> SET @cmd = N'BULK INSERT ' @TableName +
> N' FROM ''' + @FileName +
> N''' WITH (CODEPAGE = ''RAW'',
> DATAFILETYPE = ''widechar'',
> FIRSTROW = 1,
> KEEPIDENTITY,
> KEEPNULLS,
> FIELDTERMINATOR = ''\t'')'
> EXEC(@cmd)
> GO

Vi prøvede noget af det samme, hvor vi blot CAST'ede vores varchar til en
nvarchar inden afvikling af EXEC - uden godt resultat.

> Du kan bruge NVarChar i stedet for VarChar sammen med Exec (Jeg har
> haft problemer med VarChar)
> Hvor blev rowterminator af?

Jeg kunne se i BOL, at den defaulter til \n, så vi fjernede den som en
test - uden godt resultat.

> Du kan evt kikke på widenative (BOL) hvis data kommer fra en anden sql
> server vha bcp værktøjet

Data bulkloades fra nogle TAB-filer (CSV), der oprindeligt fødes fra en
SQL-server, men der sker nogle transformationer undervejs.

SQL-Svr -> XML -> OIOXML -> XML -> CSV -> Sql Svr.

--
Jesper Stocholm
http://stocholm.dk
<a href="http://www.sony.com">evil
Findes din kiosk på nettet? Se http://ekiosk.dk

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408179
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste