none
BULK INSERT von Datensätzen mit Umlauten RRS feed

  • 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 ich

    BULK 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

    Dienstag, 5. April 2016 10:16

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]

    Dienstag, 5. April 2016 16:19
  • 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

    Mittwoch, 6. April 2016 09:24

Alle Antworten

  • z.B. "München" statt "München".

    Hallo Michael,

    wenn aus einem Buchstaben zwei werden, dann liegt die Vermutung nahe, das die Datei im UTF Format vorliegt. Hast Du schon geprüft, welches Encoding die Quelldatei hat?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Dienstag, 5. April 2016 10:53
  • 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



    Dienstag, 5. April 2016 11:52
  • 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]

    Dienstag, 5. April 2016 16:19
  • 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

    Mittwoch, 6. April 2016 09:24