2017-07-07 4 views
0

seit wir auf den SQL Server 2016 migriert haben, versuchen wir jetzt, Unicode-Zeichen über BULK IMPORT in eine Tabelle zu importieren. Verwenden Sie Dateien ohne XML-Format und UTF-8-codierte Dateien (mit newline Unix (LF)). Die Formatdateien geben die Datenlänge der Hostdatei an, nicht jedoch den Terminator. Der Host-Dateityp ist SQLCHAR. Meine Anweisung von Bulk wie folgt aussieht:Massenimport Unicode mit SQL Server 2016

SET @cmd = N'Bulk Insert myTable from ''D:\DATA\datafile'' with (DATAFILETYPE =''widechar'', KEEPNULLS, FORMATFILE = ''D:\DATA\fmt\formatfile.ftm'' ,MAXERRORS = 0, codepage=65001, FIRSTROW = 1)' 

EXECUTE (@cmd) 

Format Datei:

9.0 
    7 
    1  SQLCHAR  0  8  "" 1  column_1 "" 
    2  SQLCHAR  0  8  "" 2  column_2 "" 
    3  SQLCHAR  0  12  "" 3  column_3 "" 
    4  SQLCHAR  0  8  "" 4  column_4 "" 
    5  SQLCHAR  0  12  "" 5  column_5 "" 
    6  SQLCHAR  0  40  "" 6  column_6 "" 
    7  SQLCHAR  0  8  ";\n" 7  column_7 "" 

Tabellendefinition:

CREATE TABLE #myTable 
( [column_1] [nvarchar](8) NOT NULL, 
    [column_2] [nvarchar](8) NULL, 
    [column_3] [nvarchar](12) NULL, 
    [column_4] [nvarchar](8) NOT NULL, 
    [column_5] [nvarchar](12) NULL, 
    [column_6] [nvarchar](40) NULL, 
    [column_7] [datetime] NULL) 

Die Bulk die gewöhnlichen Zeichen importieren können (wie A, B, C. ..) ohne Probleme. Aber wenn es um Zeichen wie Ä oder Ü geht, scheint das BULK INSERT diese Zeichen in zwei Teile zu teilen, so dass die Dateidatenlänge um eins zunimmt (wenn die Zeichenkette nur ein Zeichen wie Ä enthält). Das letzte Zeichen aus der Zeichenfolge wird als erstes Zeichen in die nächste Tabellenspalte eingefügt. Irgendeine Idee, wie man dieses Problem löst? Da die Dateien von Dritten stammen, kann ich deren Erstellung nicht beeinflussen.

S.S .: BTW, das BCP-Tool macht das gleiche.

Jede Hilfe ist willkommen!

Vielen Dank!

+0

Was wird die * actual * Anweisung ausgeführt? Warum zeigen Sie eine Linie mit Verkettung? –

+0

Können Sie bitte die Formatdatei in Ihre Frage aufnehmen? –

+0

Wie für die Zeichenlängen benötigt Ä zwei Bytes in UTF8. Sie haben wahrscheinlich eine * NON * -UTF8-Kodierung für die Spalten und eine feste Länge verwendet, was bedeutet, dass SQL Server * Bytes * nicht Zeichen gezählt hat - so wie es sein sollte –

Antwort

0

Gelöst! Meine Schritte: - konvertiert die Datendateien in Unicode - in Bulk Einfügen Anweisungssatz CodePage = 65001 und Datafiletype = 'widechar' - in den Nicht-XML-Format-Dateien Host Dateityp auf SQLNCHAR (dank Panagiotis-s. Kommentare zu der Frage) und duplizierte die Host-Datei Datenlänge.