因爲我們已經遷移到SQL Server 2016我們現在試圖通過使用非XML格式文件和UTF-8編碼數據文件(使用新行Unix(如果)) 。格式文件指定主機文件數據長度,但不包含終止符。主機文件數據類型是SQLCHAR。我BULK INSERT語句如下:批量導入Unicode與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)
格式文件:
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 ""
表定義:
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)
的BULK INSERT可以導入普通字符(如A,B,C。 ..)沒有任何麻煩。但是對於像Ä或Ü這樣的字符,BULK INSERT似乎會將這些字符分成兩部分,這樣文件數據長度會增加1(如果字符串只包含一個字符,如Ä)。字符串中的最後一個字符將作爲第一個字符插入到下一個表格列中。任何想法如何解決這個問題?由於數據文件來自第三方,我不能影響這些數據的創建/操作。
P.S.:BTW,BCP工具也是這樣。
任何幫助表示讚賞!
謝謝!
執行的* actual *語句是什麼?你爲什麼顯示一個串聯的行? –
你可以在你的問題中包含格式文件嗎? –
至於字符長度,Ä需要UTF8中的兩個字節。您可能對列和固定長度使用了* NON * -UTF8編碼,這意味着SQL Server計數*字節*不是字符 - 因爲它應該是 –