批量导入Unicode与SQL Server 2016

问题描述:

因为我们已经迁移到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计数*字节*不是字符 - 因为它应该是 –

解决!我的步骤: - 将数据文件转换为Unicode - 在Bulk Insert语句中设置CodePage = 65001和Datafiletype ='widechar' - 在非XML格式文件中设置主机文件数据类型为SQLNCHAR(感谢Panagiotis - s。对问题的评论)并且复制主机文件数据长度。