Ich versuche, Massendaten aus einer CSV-Datei in die Datenbank aufzunehmen.
In der Mitarbeitertabelle wird eine Spalte ID
(PK) automatisch inkrementiert.
CREATE TABLE [dbo].[Employee](
[id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
[Address] [varchar](50) NULL
) ON [PRIMARY]
Ich benutze diese Abfrage:
BULK INSERT Employee FROM 'path\tempFile.csv '
WITH (FIRSTROW = 2,KEEPIDENTITY,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
CSV-Datei -
Name,Address
name1,addr test 1
name2,addr test 2
aber es führt zu dieser Fehlermeldung:
Fehler beim Konvertieren von Massenladedaten (Typfehlanpassung oder ungültiges Zeichen für die angegebene Codepage) für Zeile 2, Spalte 1 (ID).
KEEPIDENTITY
Ding gesucht ... danke!Antworten:
BULK INSERT nicht direkt in Ihre realen Tabellen.
Ich würde immer
dbo.Employee_Staging
(ohneIDENTITY
Spalte) aus der CSV-Dateiund kopieren Sie dann die Daten mit einer T-SQL-Anweisung wie folgt in die reale Tabelle:
INSERT INTO dbo.Employee(Name, Address) SELECT Name, Address FROM dbo.Employee_Staging
quelle
Fügen Sie der CSV-Datei eine ID-Spalte hinzu und lassen Sie sie leer:
Entfernen Sie das Schlüsselwort KEEPIDENTITY aus der Abfrage:
BULK INSERT Employee FROM 'path\tempFile.csv ' WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
Das ID-Identitätsfeld wird automatisch inkrementiert.
Wenn Sie dem ID-Feld in der CSV Werte zuweisen, werden diese ignoriert, sofern Sie nicht das Schlüsselwort KEEPIDENTITY verwenden. Sie werden dann anstelle der automatischen Inkrementierung verwendet.
quelle
Ich hatte ein ähnliches Problem, musste aber sicherstellen, dass die Reihenfolge der ID mit der Reihenfolge in der Quelldatei übereinstimmt. Meine Lösung verwendet eine ANSICHT für das BULK INSERT:
Behalten Sie Ihre Tabelle bei und erstellen Sie diese ANSICHT (wählen Sie alles außer der ID-Spalte aus).
CREATE VIEW [dbo].[VW_Employee] AS SELECT [Name], [Address] FROM [dbo].[Employee];
Ihr BULK INSERT sollte dann so aussehen:
BULK INSERT [dbo].[VW_Employee] FROM 'path\tempFile.csv ' WITH (FIRSTROW = 2,FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n');
quelle
Sie müssen eine Masseneinfügung mit der Formatdatei durchführen:
BULK INSERT Employee FROM 'path\tempFile.csv ' WITH (FORMATFILE = 'path\tempFile.fmt');
Dabei sieht die Formatdatei (tempFile.fmt) folgendermaßen aus:
Weitere Details finden Sie hier - http://msdn.microsoft.com/en-us/library/ms179250.aspx
quelle
Meine Lösung besteht darin, das ID-Feld als LETZTES Feld in der Tabelle hinzuzufügen, sodass das Masseneinfügen es ignoriert und automatische Werte erhält. Sauber und einfach ...
Zum Beispiel beim Einfügen in eine temporäre Tabelle:
CREATE TABLE #TempTable (field1 varchar(max), field2 varchar(max), ... ROW_ID int IDENTITY(1,1) NOT NULL)
Beachten Sie, dass das
ROW_ID
Feld immer als LAST-Feld angegeben werden muss!quelle
Row 2 File Offset 528 ErrorFile Offset 0 - HRESULT 0x80020005
und in meinem stderr:msgtext = 'Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 5 (QMid).'
Ich hatte genau das gleiche Problem, das zu Verluststunden führte, daher bin ich inspiriert, meine Erkenntnisse und Lösungen zu teilen, die für mich funktionierten.
1. Verwenden Sie eine Excel-Datei
Dies ist der Ansatz, den ich gewählt habe. Anstatt eine CSV-Datei zu verwenden, habe ich eine Excel-Datei (.xlsx) mit Inhalten wie unten verwendet.
Beachten Sie, dass die ID-Spalte keinen Wert hat.
Stellen Sie als Nächstes mit Microsoft SQL Server Management Studio eine Verbindung zu Ihrer Datenbank her, klicken Sie mit der rechten Maustaste auf Ihre Datenbank und wählen Sie Daten importieren (Untermenü unter Aufgabe). Wählen Sie Microsoft Excel als Quelle. Wenn Sie die Stufe "Quellentabellen und -ansichten auswählen" erreicht haben, klicken Sie auf Zuordnungen bearbeiten .
id
Klicken Sie für die Spalte unter Ziel darauf und wählen Sie Ignorieren . ÜberprüfenEnable Identity insert
Sie dies nur, wenn Sie IDs beibehalten möchten, wenn Sie Daten aus einer anderen Datenbank importieren und die automatische Inkrementierungs-ID der Quelldatenbank beibehalten möchten. Fahren Sie fort, um fertig zu werden, und das war's. Ihre Daten werden reibungslos importiert.2. Verwenden der CSV-Datei
Stellen Sie in Ihrer CSV-Datei sicher, dass Ihre Daten wie folgt sind.
Führen Sie die folgende Abfrage aus:
BULK INSERT Metrics FROM 'D:\Data Management\Data\CSV2\Production Data 2004 - 2016.csv ' WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');
Das Problem bei diesem Ansatz besteht darin, dass sich die CSV auf dem DB-Server oder in einem freigegebenen Ordner befinden sollte, auf den die DB zugreifen kann. Andernfalls wird möglicherweise die Fehlermeldung "Datei kann nicht geöffnet werden. Das Betriebssystem hat den Fehlercode 21 zurückgegeben (Das Gerät ist nicht bereit) angezeigt ) ".
Wenn Sie eine Verbindung zu einer entfernten Datenbank herstellen, können Sie Ihre CSV in ein Verzeichnis auf diesem Server hochladen und auf den Pfad in der Masseneinfügung verweisen.
3. Verwenden der CSV-Datei und der Importoption von Microsoft SQL Server Management Studio
Starten Sie Ihre Importdaten wie im ersten Ansatz. Für Quelle, wählen Sie Flatfile - Quelle und suchen Sie nach Ihrer CSV - Datei. Stellen Sie sicher, dass das richtige Menü (Allgemein, Spalten, Erweitert, Vorschau) in Ordnung ist. Stellen Sie sicher, dass Sie das richtige Trennzeichen im Spaltenmenü (Spaltenbegrenzer) festlegen. Klicken Sie wie im obigen Excel-Ansatz auf Zuordnungen bearbeiten . Klicken Sie für die ID-Spalte unter Ziel darauf und wählen Sie Ignorieren .
Fahren Sie fort, um fertig zu werden, und das war's. Ihre Daten werden reibungslos importiert.
quelle
quelle
Dies ist ein sehr alter Beitrag, der beantwortet werden muss, aber keine der gegebenen Antworten löst das Problem, ohne die gestellten Bedingungen zu ändern, was ich nicht tun kann.
Ich habe es mit der OPENROWSET-Variante von BULK INSERT gelöst. Dies verwendet dieselbe Formatdatei und funktioniert auf dieselbe Weise, ermöglicht jedoch das Lesen der Datendatei mit einer SELECT-Anweisung.
Erstellen Sie Ihre Tabelle:
CREATE TABLE target_table( id bigint IDENTITY(1,1), col1 varchar(256) NULL, col2 varchar(256) NULL, col3 varchar(256) NULL)
Öffnen Sie ein Befehlsfenster und führen Sie Folgendes aus:
Dadurch wird die Formatdatei basierend auf dem Aussehen der Tabelle erstellt.
Bearbeiten Sie nun die Formatdatei und entfernen Sie die gesamten Zeilen mit FIELD ID = "1" und COLUMN SOURCE = "1", da dies in unserer Datendatei nicht vorhanden ist.
Passen Sie auch die Terminatoren an, die für Ihre Datendatei erforderlich sind:
Jetzt können wir die Datendatei mit einer Auswahl in unsere Tabelle laden und so die volle Kontrolle über die Spalten haben. In diesem Fall können wir keine Daten in die Identitätsspalte einfügen:
INSERT INTO target_table (col1,col2, col3) SELECT * FROM openrowset( bulk 'C:\data_file.txt', formatfile='C:\format_file.xml') as t;
quelle
Eine andere Option, wenn Sie temporäre Tabellen anstelle von Staging-Tabellen verwenden, besteht darin, die temporäre Tabelle wie beim Import erwartet zu erstellen und nach dem Import die Identitätsspalte hinzuzufügen.
Ihr SQL macht also ungefähr so:
Immer noch nicht sehr sauber, aber es ist eine andere Option ... muss möglicherweise auch Schlösser bekommen, um sicher zu sein.
quelle