Jag har en datafil i txt-format och jag laddade den med Bulk Insert i följande kommando:
Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", )
Koden fungerar bra. Men medan jag försökte använda en formatfil med bulkinsatsen för att ladda filen, stötte jag på några problem med att specificera fältavslutaren för den sista raden.
Här är specifikationen för den sista raden i formatfil:
21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS
Med ”0x0a” som terminator får jag följande fel:
Omvandlingsfel för massbelastningsdata (trunkering) för rad 2, kolumn 1 (var1).
Med ”\ n” kan data laddas, men ”|” laddas också i den sista kolumnen. Till exempel får jag ”0,5 |” istället för ”0.5”.
”| \ n”, ”0x0a”, ”| 0x0a”, ”\ r \ n” returnerar samma fel som ”|”
Konverteringsfel för massbelastningsdata (trunkering) för rad 2, kolumn 1 (var1).
I ” m använder sql-server 2016, windows 10 64bit.
Kan någon hjälpa till med detta? Tack på förhand för din hjälp!
Jason
Kommentarer
- Eftersom du ' har ställt några frågor om det nu, ge den här sidan en titt: ommarskog.se/bulkload.html
- @sp_BlitzErik, tack för ditt svar! Den artikeln är väldigt användbar och ger mycket mer information än MSDN-webbplatsen. När du läser exemplet under 4.1 , Jag blev förvirrad med fältavslutaren " \ " \ r \ n ", citatet är anteckningen riktigt komplett, är det en typ?
- Om jag minns rätt är det ' en escape-sekvens. Om du behåller rea ding där ' en bättre förklaring längre ner.
Svar
Efter en hel dag som kämpade med Line Feed / Hex-kod fann jag äntligen att mitt problem orsakades av saknade kolumner i formatfilerna. Datauppsättningen är ny för mig och jag trodde att den hade 21 rader medan den faktiskt har 22 rader. Därför fortsatte SQL-servern att ladda den sista ”|” från datafilen.
Här är en referens för andra som kanske är intresserade av att ladda datafilen från UNIX-systemet med radterminatorer som skiljer sig från Windows, det finns tre metoder:
- använd bulkinsats och ställ in radterminatorn som ”0x0a”.
- använd en formatfil och ställ in fältterminatorn för det sista fältet som ”\ n ”.
- Använd en dynamisk SQL med funktionen Char (10) för att infoga radmatningen (LF) i kommandosträngen och kör sedan () kommandosträngen.
Innan du testar dessa metoder, använd ett anteckningsblock för att visa alla kontrolltecken för att bekräfta kontrolltecken som används av textfilerna.
Om ingen av dessa metoder fungerar för dig kan du ha några andra problem än raden feed / radterminator.