Benutzer mit den meisten Antworten
BULK INSERT von Datensätzen mit Umlauten

Frage
-
Hallo zusammen,
auf dem SQL Server 2014 möchte ich eine CSV-Datei mittels BULK INSERT importieren. Die Datensätze in der CSV-Datei enthalten Umlaute. Die Datei wird z.B. in Excel tadellos lesbar dargestellt. Beim Import der Daten in den SQL Server werden die Umlaute allerdings durch Sonderzeichen ersetzt, z.B. "München" statt "München".
Für den Import verwende ich eine Formatdatei, weil einige Spalten nicht importiert werden sollen. Hier der Befehl:
BULK INSERT Ort FROM 'C:\SQLServer\Orte.CSV' WITH (FORMATFILE = 'C:\SQLServer\Orte.fmt', CODEPAGE ='ACP')
Auch schon probiert habe ichBULK INSERT Ort FROM 'C:\SQLServer\Orte.CSV' WITH (FORMATFILE = 'C:\SQLServer\Orte.fmt', CODEPAGE ='ACP', DATAFILETYPE='WIDENATIVE')
beides auch mit CODEPAGE = 'OEM'.
Kann mir bitte jemand sagen, wie ich die Umlaute korrekt importiere?
Vielen Dank und viele Grüße
Michael
Antworten
-
Datenkonvertierungsfehler (Abschneiden) beim Massenladen für 1-Zeile, 2-Spalte (GemeindeID)."
Hallo Michael,
so schwierig ist es eigentlich nicht, Daten per Bulk Insert zu laden. Nur unterstützt der SQL Server erst mal kein UTF, sondern ASCII und Unicode; die Daten müssen in dem Format vorliegen. Und wenn man die Meldung oben bekommt, dann weil in der Quelldatei längere Daten vorliegen, als per Format-Datei oder Tabellendesign zulässig sind und somit abgeschnitten wurden, wie die Meldung es auch sagt.
Du kannst ein ErrorFile angeben, in die alle Zeilen der Quelldatei umgeleitet werden, wenn sie nicht importiert werden konnten, dann kannst Du nachsehen, ob es wirklich an der Länge liegt; siehe BULK INSERT (Transact-SQL) => ERRORFILE
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Benjamin.Hoch Mittwoch, 6. April 2016 09:25
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 6. Mai 2016 13:37
-
So, hier die Lösung:
ich habe die CSV-Datei mit dem Windows Editor geladen und mittels "Speichern unter" überschrieben, wobei ich die Codierung auf "Unicode" festgelegt habe.
Dann habe ich die Formatdatei wie folgt abgeändert:
Die Text-Datenfelder in der Datenbanktabelle haben den Datentyp "NVARCHAR".
Der BULK INSERT-Befehl:
BULK INSERT Ort FROM 'C:\SQLServer\Orte.CSV' WITH (FORMATFILE = 'C:\SQLServer\Orte.fmt', DATAFILETYPE='WIDECHAR')
Viele Grüße
Michael
- Als Antwort markiert Bayer, Michael Freitag, 8. April 2016 07:39
Alle Antworten
-
-
Hallo Olaf,
vielen Dank.
Es handelt sich tatsächlich um eine UTF8-Datei. Ich hab sie - lt. einem Internetbeitrag - in "UCS-2 Big Endian" umgewandelt und wollte sie dann importieren:
BULK INSERT Ort FROM 'C:\SQLServer\Orte.CSV' WITH (FORMATFILE = 'C:\SQLServer\Orte.fmt', CODEPAGE ='ACP')
Allerdings erhalte ich jetzt die Meldung:
Fehler beim Massenladen. Die Spalte in der Datendatei ist zu lang für 1-Zeile, 5-Spalte. Überprüfen Sie, ob das Feldabschlusszeichen und das Zeilenabschlusszeichen richtig angegeben sind.
Hier ist die Formatdatei Orte.fmt:
12.0 5 1 SQLCHAR 0 37 ";" 1 OrtID "" 2 SQLCHAR 0 37 ";" 3 GemeindeID "" 3 SQLCHAR 0 100 ";" 4 Bezeichnung SQL_Latin1_General_CP1_CI_AS 4 SQLCHAR 0 41 ";" 5 LAT "" 5 SQLCHAR 0 41 "\r\n" 6 LON ""
Es ist die unveränderte Formatdatei, mit der der Export der CSV-Datei im UTF8-Format geklappt hat, bei dem allerdings die Umlaute zerstört wurden.
Nach der Anpassung der Formatdatei in
12.0 5 1 SQLNCHAR 0 37 ";" 1 OrtID "" 2 SQLNCHAR 0 37 ";" 3 GemeindeID "" 3 SQLNCHAR 0 100 ";" 4 Bezeichnung SQL_Latin1_General_CP1_CI_AS 4 SQLNCHAR 0 41 ";" 5 LAT "" 5 SQLNCHAR 0 41 "000D,000A" 6 LON ""
führt die Anweisung
BULK INSERT Ort FROM 'C:\SQLServer\Orte.CSV' WITH (FORMATFILE = 'C:\SQLServer\Orte.fmt', DATAFILETYPE='WIDECHAR')
zum Fehler"Meldung 4863, Ebene 16, Status 1, Zeile 14
Datenkonvertierungsfehler (Abschneiden) beim Massenladen für 1-Zeile, 2-Spalte (GemeindeID)."Ist das tatsächlich so kompliziert, eine einfache CSV-Datei mit Umlauten in eine SQL Server-Datenbank zu konvertieren oder sehe ich das Offensichtliche nicht?
Vielen Dank.
Michael
- Bearbeitet Bayer, Michael Dienstag, 5. April 2016 15:45
-
Datenkonvertierungsfehler (Abschneiden) beim Massenladen für 1-Zeile, 2-Spalte (GemeindeID)."
Hallo Michael,
so schwierig ist es eigentlich nicht, Daten per Bulk Insert zu laden. Nur unterstützt der SQL Server erst mal kein UTF, sondern ASCII und Unicode; die Daten müssen in dem Format vorliegen. Und wenn man die Meldung oben bekommt, dann weil in der Quelldatei längere Daten vorliegen, als per Format-Datei oder Tabellendesign zulässig sind und somit abgeschnitten wurden, wie die Meldung es auch sagt.
Du kannst ein ErrorFile angeben, in die alle Zeilen der Quelldatei umgeleitet werden, wenn sie nicht importiert werden konnten, dann kannst Du nachsehen, ob es wirklich an der Länge liegt; siehe BULK INSERT (Transact-SQL) => ERRORFILE
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Benjamin.Hoch Mittwoch, 6. April 2016 09:25
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 6. Mai 2016 13:37
-
So, hier die Lösung:
ich habe die CSV-Datei mit dem Windows Editor geladen und mittels "Speichern unter" überschrieben, wobei ich die Codierung auf "Unicode" festgelegt habe.
Dann habe ich die Formatdatei wie folgt abgeändert:
Die Text-Datenfelder in der Datenbanktabelle haben den Datentyp "NVARCHAR".
Der BULK INSERT-Befehl:
BULK INSERT Ort FROM 'C:\SQLServer\Orte.CSV' WITH (FORMATFILE = 'C:\SQLServer\Orte.fmt', DATAFILETYPE='WIDECHAR')
Viele Grüße
Michael
- Als Antwort markiert Bayer, Michael Freitag, 8. April 2016 07:39