批量导入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工具也是这样。
任何帮助表示赞赏!
谢谢!
答
解决!我的步骤: - 将数据文件转换为Unicode - 在Bulk Insert语句中设置CodePage = 65001和Datafiletype ='widechar' - 在非XML格式文件中设置主机文件数据类型为SQLNCHAR(感谢Panagiotis - s。对问题的评论)并且复制主机文件数据长度。
执行的* actual *语句是什么?你为什么显示一个串联的行? –
你可以在你的问题中包含格式文件吗? –
至于字符长度,Ä需要UTF8中的两个字节。您可能对列和固定长度使用了* NON * -UTF8编码,这意味着SQL Server计数*字节*不是字符 - 因为它应该是 –