【发布时间】:2017-12-11 10:19:05
【问题描述】:
由于我们已迁移到 SQL Server 2016,我们现在尝试使用非 XML 格式文件和 UTF-8 编码数据文件(使用换行符 Unix (LF))通过 BULK IMPORT 将 Unicode 字符导入表中。格式文件指定主机文件数据长度,但不指定终止符。主机文件数据类型是 SQLCHAR。我的 BULK INSERT 语句如下所示:
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.:顺便说一句,BCP 工具也是如此。
感谢任何帮助!
谢谢!
【问题讨论】:
-
执行的实际语句是什么?为什么要显示串联的行?
-
能否在您的问题中包含格式文件?
-
对于字符长度,Ä UTF8 中需要两个字节。您可能对列使用了 NON-UTF8 编码和固定长度,这意味着 SQL Server 计算 bytes 而不是字符 - 因为它应该
-
SQLCHAR表示 ASCII -
根据this support article,似乎在 2014 SP2 中添加了对 Bulk Insert 的 UTF8 支持。代码页设置为
WITH (CODEPAGE = '65001', DATAFILETYPE = 'Char')。
标签: sql-server unicode bulkinsert