Feltterminatorproblem i formatere filer

Jeg har en datafil i txt-format, og jeg pleide å laste den med Bulk Insert i følgende kommando:

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

Koden fungerer bra. Mens jeg prøvde å bruke en formatfil med bulkinnsatsen for å laste filen, opplevde jeg imidlertid noen problemer med å spesifisere feltterminatoren for den siste raden.

Her er spesifikasjonen for den siste raden 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 feil:

Konverteringsfeil for masselastdata (trunkering) for rad 2, kolonne 1 (var1).

Med «\ n» kan data lastes, men «|» er også lastet inn i den siste kolonnen. For eksempel får jeg «0,5 |» i stedet for «0.5».

«| \ n», «0x0a», «| 0x0a», «\ r \ n» returnerer den samme feilen som «|»

Konverteringsfeil for masselastedata (avkorting) for rad 2, kolonne 1 (var1).

I » m bruker sql-server 2016, windows 10 64bit.

Kan noen hjelpe med dette? Takk på forhånd for din hjelp!

Jason

Kommentarer

  • Siden du ' har stilt noen spørsmål om det nå, kan du se denne siden: sommarskog.se/bulkload.html
  • @sp_BlitzErik, takk for svaret! Denne artikkelen er veldig nyttig og gir mye mer informasjon enn MSDN-siden. Mens du leser eksemplet under 4.1 , Ble jeg forvirret med feltterminatoren " \ " \ r \ n ", sitatet er merket virkelig komplett, er det en type?
  • Hvis jeg husker riktig, er det ' en rømningssekvens. Hvis du holder rea ting der ' en bedre forklaring lenger nede.

Svar

Etter en hel dag med å slite med Line Feed / Hex-kode, fant jeg endelig at problemet mitt var forårsaket av manglende kolonner i formatfilene. Datasettet er nytt for meg, og jeg trodde det hadde 21 rader mens det faktisk har 22 rader. Det er derfor SQL Server fortsatte å laste den siste «|» fra datafilen.

Her er en referanse for andre som kanskje er interessert i å laste datafilen fra UNIX-systemet med radterminatorer som er forskjellige fra Windows, det er tre metoder:

  1. bruk bulkinnsats og sett radterminatoren som «0x0a».
  2. bruk en formatfil og sett feltterminatoren til det siste feltet som «\ n «.
  3. Bruk en dynamisk sql med funksjon Char (10) for å sette inn linjefôringen (LF) i kommandostrengen og deretter utføre () kommandostrengen.

Før du prøver disse metodene, bruk et notisblokk for å vise alle kontrolltegnene for å bekrefte kontrolltegnene som brukes av tekstfilene.

Hvis ingen av disse metodene fungerer for deg, kan det hende du har andre problemer enn linjen. feed / radterminator.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *