2013-05-01 46 views
1

我从一个竖线分隔CSV文件到SQL Server批量导入数据。该数据被格式化等批量插入包括线路终端

A | B | CCCCCC \ r \ n

我双双为“\ r \ n”个由该文件是在UTF-8格式和行终止观看验证CSV文件在十六进制编辑器中。

的命令是

BULK INSERT MyTable FROM 'C:\Path\File.csv' 
WITH (FIRSTROW=1, MAXERRORS=0, BATCHSIZE=10000, FIELDTERMINATOR = '|', 
     ROWTERMINATOR = '\r\n') 

最初被定义为CHAR第三列(6)此字段总是恰好宽6(ASCII)字符的代码。这在批量插入过程中导致截断错误。

我然后加宽的列CHAR(8)。进口的工作,但

SELECT CAST(Col3 As VARBINARY(MAX)) 

表示列数据与0x0D0A(或“\ r \ n”,行终止)

为什么行终止符被包括在导入数据

,以及如何结束我能解决这个问题吗?

回答

1

长话短说,SQL Server不支持UTF-8,你只需要\n作为行终止。

它实际上有点不清楚发生了什么事情,因为你没有提供该表的定义或精确的错误消息。说了这么多,我可以加载以下数据:

create table dbo.BCPTest (
    col1 nchar(1) not null, 
    col2 nchar(1) not null, 
    col3 nchar(6) not null 
) 

/* This data can saved as ASCII, UTF-16 with BOM or UTF-8 without BOM 
    (see comments below) 

A|B|CCCCCC 
D|E|FFFFFF 

*/ 

BULK INSERT dbo.BCPTest FROM 'c:\testfile.csv' 
WITH (FIELDTERMINATOR = '|', ROWTERMINATOR = '\n') 

评论:

  • 当我创建并在记事本中保存了一个为“UTF-8”,它增加了BOM字节0xEFBBBF这是标准UTF-8 BOM
  • 但是,SQL服务器doesn't support UTF-8, it supports UTF-16(官方文档here),它expects 0xFFFE的BOM
  • 所以我在记事本中再次将文件保存为“统一”,并增加了0xFFFE BOM;如上所示,这装载罚款。出于好奇,我也救了它(用记事本+ +)为“UTF-8无BOM”,我可以加载该文件也
  • 将文件保存为ASCII还加载细跟同桌的数据类型和BULK INSERT命令
  • 的行终止应\n\r\n因为\ninterpreted as a "newline",即SQL服务器(和/或Windows)通过解释\n语义,而不是字面是“聪明”。这很可能是\r\nC handling的结果,它不要求从字面上解释它们。
+0

这是ROWTERMINATOR。 – 2013-05-01 15:35:25