批量插入包括行终止符

时间:2013-05-01 02:54:19

标签: sql-server sql-server-2008-r2

我将数据从管道分离的CSV文件批量导入SQL Server。数据的格式类似于

A | B | CCCCCC \ r \ n

我已经验证了该文件是UTF-8格式,并且通过在十六进制编辑器中查看CSV文件以“\ r \ n”终止这些行。

命令是

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 个答案:

答案 0 :(得分: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 Server doesn't support UTF-8, it supports UTF-16(官方文档here)和expects BOM为0xFFFE
  • 所以我在记事本中再次将文件保存为“Unicode”,并添加了0xFFFE BOM;这装好了,如上所示。出于好奇,我还将它(使用Notepad ++)保存为“没有BOM的UTF-8”,我也可以加载该文件
  • 将文件另存为ASCII也可以使用相同的表数据类型和BULK INSERT命令
  • 进行正常加载
  • 行终止符应该是\n而不是\r\n,因为\ninterpreted as a "newline",即SQL Server(和/或Windows)通过解释{{ 1}}语义而不是字面意思。这很可能是\n \r\n的结果,不需要对它们进行字面解释。