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:
- bruk bulkinnsats og sett radterminatoren som «0x0a».
- bruk en formatfil og sett feltterminatoren til det siste feltet som «\ n «.
- 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.