2017-07-07 111 views
0

因爲我們已經遷移到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工具也是這樣。

任何幫助表示讚賞!

謝謝!

+0

執行的* actual *語句是什麼?你爲什麼顯示一個串聯的行? –

+0

你可以在你的問題中包含格式文件嗎? –

+0

至於字符長度,Ä需要UTF8中的兩個字節。您可能對列和固定長度使用了* NON * -UTF8編碼,這意味着SQL Server計數*字節*不是字符 - 因爲它應該是 –

回答

0

解決!我的步驟: - 將數據文件轉換爲Unicode - 在Bulk Insert語句中設置CodePage = 65001和Datafiletype ='widechar' - 在非XML格式文件中設置主機文件數據類型爲SQLNCHAR(感謝Panagiotis - s。對問題的評論)並且複製主機文件數據長度。