Ik heb een gegevensbestand in txt-formaat en ik laadde het met Bulk Insert in de volgende opdracht:
Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", )
De code werkt goed. Maar terwijl ik probeerde een formaatbestand te gebruiken met de bulk-invoeging om het bestand te laden, kwam ik enkele problemen tegen bij het specificeren van de veldterminator voor de laatste rij.
Hier is de specificatie voor de laatste rij in de format bestand:
21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS
Met “0x0a” als terminator krijg ik de volgende foutmelding:
Conversiefout in bulk laden van gegevens (afkappen) voor rij 2, kolom 1 (var1).
Met “\ n” kunnen gegevens worden geladen, maar “|” wordt ook in de laatste kolom geladen. Ik krijg bijvoorbeeld “0,5 |” in plaats van “0.5”.
“| \ n”, “0x0a”, “| 0x0a”, “\ r \ n” retourneert dezelfde fout als “|”
Conversiefout van gegevens bij bulk laden (afkappen) voor rij 2, kolom 1 (var1).
I ” m met behulp van sql-server 2016, windows 10 64bit.
Kan iemand hierbij helpen? Alvast bedankt voor je hulp!
Jason
Reacties
- Aangezien je ' er nu een paar vragen over hebt gesteld, kun je deze pagina eens bekijken: sommarskog.se/bulkload.html
- @sp_BlitzErik, bedankt voor je antwoord! Dat artikel is erg nuttig en biedt veel meer informatie dan de MSDN-site. Tijdens het lezen van het voorbeeld onder 4.1 , Raakte ik in de war met de veldterminator " \ " \ r \ n ", het citaat is noot echt compleet, is het een type?
- Als ik het me goed herinner, is het ' een escape-reeks. Als je rea daar ' is een betere uitleg verderop.
Antwoord
Na een hele dag worstelen met Line Feed / Hex-code, ontdekte ik eindelijk dat mijn probleem werd veroorzaakt door ontbrekende kolommen in de formaatbestanden. De dataset is nieuw voor mij en ik dacht dat het 21 rijen had, terwijl het eigenlijk 22 rijen heeft. Daarom bleef de sql-server de laatste “|” uit het gegevensbestand laden.
Hier is een referentie voor anderen die misschien geïnteresseerd zijn in het laden van gegevensbestanden van een UNIX-systeem met andere rijterminators dan Windows, er zijn drie methoden:
- gebruik bulksgewijs invoegen en stel de rij-terminator in op “0x0a”.
- gebruik een formaatbestand en stel de veldterminator van het laatste veld in als “\ n “.
- Gebruik een dynamische sql met functie Char (10) om de line feed (LF) in de commandostring in te voegen en vervolgens exec () de commandostring.
Voordat u deze methoden uitprobeert, gebruikt u een notitieblok om alle besturingstekens weer te geven om de besturingstekens die door de tekstbestanden worden gebruikt te bevestigen.
Als geen van deze methoden voor u werkt, heeft u mogelijk andere problemen dan de regel feed / row terminator.