【问题标题】:Bulk Insert Includes Line Terminator批量插入包括行终止符
【发布时间】:2013-05-01 02:54:19
【问题描述】:

我正在将管道分隔的 CSV 文件中的数据批量导入 SQL Server。数据格式如下

A|B|CCCCCC\r\n

通过在十六进制编辑器中查看 CSV 文件,我已验证文件为 UTF-8 格式,并且行以“\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”,行终止符)结尾

为什么在导入的数据中包含行终止符,我该如何解决?

【问题讨论】:

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


    【解决方案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++)保存为“UTF-8 without BOM”,我也可以加载该文件
    • 将文件保存为 ASCII 也可以使用相同的表数据类型和 BULK INSERT 命令正常加载
    • 行终止符应该是\n 而不是\r\n,因为\ninterpreted as a "newline",即SQL Server(和/或Windows)通过语义而不是字面解释\n 来“聪明”。这很可能是\r\nC handling 的结果,这并不要求它们按字面意思解释。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2015-02-04
      • 2017-07-18
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多