2016-12-02 9 views
0

Ich versuche BULK INSERT zu verwenden, um Zeilen zu einer vorhandenen Tabelle aus einer CSV-Datei hinzuzufügen. Denn jetzt habe ich eine kleine Datei zu Testzwecken mit der folgenden Formatierung:BULK INSERT nicht korrekt aus CSV einfügen

UserID,Username,Firstname,Middlename,Lastname,City,Email,JobTitle,Company,Manager,StartDate,EndDate 
273,abc,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd 
274,dfg,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd 
275,hij,dd,dd,dd,dd,dd,dd,dd,dd,dd,dd 

Und das ist, was meine Abfrage sieht derzeit wie:

BULK INSERT DB_NAME.dbo.Users 
    FROM 'C:\data.csv' 
    WITH 
    (
     FIRSTROW = 2, 
     FIELDTERMINATOR = ',', 
     ROWTERMINATOR = '\n' 
    ) 

Wenn ich diese Abfrage ausführen, es gibt 1 Zeile betroffen. Ich habe den Eintrag in der Tabelle überprüft und festgestellt, dass die Daten in der Datei in der Tabelle als einzelne Zeile eingefügt werden.

Was könnte das verursachen? Ich versuche, diese Zeilen in einzelne Zeilen in der Tabelle einzufügen. Siehe (lang) Bild unten enter image description here

Die erste Spalte tatsächlich eine Identity-Spalte ist so in der Datei ich eine ganze Zahl nur angegeben, obwohl sie überschrieben werden durch die Auto-ID erzeugt, wie ich bin nicht sicher, wie die Abfrage sagen noch aus dem zweiten Feld einfügen.

Es gibt mehr Spalten in der tatsächlichen Tabelle als in der Datei angegeben, da nicht alles gefüllt werden muss. Könnte das das verursachen?

+1

Überprüfen Sie in Ihrem bevorzugten Texteditor, was alle Symbole sind. ZB in Notepad ++ aktivieren Sie "Alle Symbole anzeigen". Vielleicht enden Ihre Zeilen mit '\ r' anstatt' \ r \ n'. –

+1

Zum Testen könnten Sie eine temporäre Tabelle ohne das Identity-Feld erstellen und die WITH-Anweisung entfernen, um zu sehen, welche Daten zurückgegeben werden? –

+0

Je nach Zeichencodierung werden neue Zeilenzeichen unterschiedlich markiert. Hast du es mit '/ r/n' versucht? – Fka

Antwort

2

Das Problem besteht darin, dass Sie Daten in die erste Spalte laden. Um eine Spalte zu überspringen, erstellen Sie eine Ansicht über Ihre Tabelle mit den Spalten, die Sie laden möchten, und BULK INSERT in View. Siehe unten Beispiel (von MSDN: https://msdn.microsoft.com/en-us/library/ms179250.aspx):

CREATE VIEW v_myTestSkipCol AS 
    SELECT Col1,Col3 
    FROM myTestSkipCol; 
GO 

USE AdventureWorks2012; 
GO 
BULK INSERT v_myTestSkipCol 
FROM 'C:\myTestSkipCol2.dat' 
WITH (FORMATFILE='C:\myTestSkipCol2.xml'); 
GO 

Was ich empfehlen würde Sie tun, anstatt eine Staging-Tabelle zu erstellen, die die Datei genau übereinstimmt. Laden Sie die Daten in diese Datei und verwenden Sie die INSERT-Anweisung, um sie in Ihre permanente Tabelle zu kopieren. Dieser Ansatz ist viel robuster und flexibler. Nach dem Laden der Staging-Tabelle können Sie beispielsweise vor dem Laden der permanenten Tabelle Daten überprüfen oder bereinigen.

+1

Bitte [schreiben Sie keine identischen Antworten auf mehrere Fragen] (https://meta.stackexchange.com/q/104227). Schreibe eine gute Antwort, dann vote/flag, um die anderen Fragen als Duplikate zu schließen. Wenn die Frage kein Duplikat ist, * schneide deine Antworten auf die Frage *. Ich habe [die andere Kopie] gelöscht (https://stackoverflow.com/questions/40757662/simple-sql-bulk-insert-not-working/40758128#40758128), seit dieser wurde gut erhalten. –