Field Terminator Problem i Format Files

Jeg har en datafil i txt-format, og jeg plejede at indlæse den med Bulk Insert i følgende kommando:

Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", ) 

Koden fungerer godt. Mens jeg prøvede at bruge en formatfil med bulkindsatsen til at indlæse filen, stødte jeg på nogle problemer med at specificere feltterminatoren for den sidste række.

Her er specifikationen for den sidste række i formatfil:

21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS 

Med “0x0a” som terminator får jeg følgende fejl:

Konverteringsfejl for massebelastningsdata (trunkering) for række 2, kolonne 1 (var1).

Med “\ n” kan data indlæses, men “|” er også indlæst i den sidste kolonne. For eksempel får jeg “0,5 |” i stedet for “0.5”.

“| \ n”, “0x0a”, “| 0x0a”, “\ r \ n” returnerer den samme fejl som “|”

Konverteringsfejl for massebelastningsdata (trunkering) for række 2, kolonne 1 (var1).

I ” m ved hjælp af sql-server 2016, windows 10 64bit.

Kan nogen hjælpe med dette? På forhånd tak for din hjælp!

Jason

Kommentarer

  • Da du ' har stillet et par spørgsmål om det nu, skal du kigge på denne side: sommarskog.se/bulkload.html
  • @sp_BlitzErik, tak for dit svar! Denne artikel er meget nyttig og giver langt flere oplysninger end MSDN-siden. Mens du læser eksemplet under 4.1 Blev jeg forvirret med feltterminatoren " \ " \ r \ n ", citatet er note virkelig komplet, er det en type?
  • Hvis jeg husker korrekt, er det ' en flugtsekvens. Hvis du holder rea ding der ' en bedre forklaring længere nede.

Svar

Efter en hel dag, der kæmpede med Line Feed / Hex-kode, fandt jeg endelig, at mit problem skyldtes manglende kolonner i formatfilerne. Datasættet er nyt for mig, og jeg troede, det havde 21 rækker, mens det faktisk har 22 rækker. Derfor fortsatte sql-serveren med at indlæse den sidste “|” fra datafilen.

Her er en reference til andre, der måske er interesseret i at indlæse datafilen fra UNIX-systemet med rækketerminaler, der er forskellige fra Windows, der er tre metoder:

  1. brug bulkindsats og indstil rækketerminatoren som “0x0a”.
  2. brug en formatfil og indstil feltterminatoren for det sidste felt som “\ n “.
  3. Brug en dynamisk sql med funktion Char (10) til at indsætte liniefeed (LF) i kommandostrengen og derefter udføre () kommandostrengen.

Inden du prøver disse metoder, skal du bruge et notesblok til at vise alle kontroltegn for at bekræfte de kontroltegn, der bruges af tekstfilerne.

Hvis ingen af disse metoder fungerer for dig, har du muligvis andre problemer end linjen feed / række terminator.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *