【问题标题】:BULK INSERT fails with row terminator on last rowBULK INSERT 失败,最后一行有行终止符
【发布时间】:2014-08-13 16:57:21
【问题描述】:

我正在将使用 cygwin shell 命令编译的 CSV 导入 MS SQL 2014,使用:

BULK INSERT import
from 'D:\tail.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\r', FIRSTROW = 1)
GO

我已经确认每一行都包含一个\r\n。如果我在最后一行留下 CR/LF,则批量导入失败并显示 Msg 4832:

批量加载:在数据文件中遇到了意外的文件结尾。

如果我在最后一个数据行的末尾结束文件,则批量导入成功。

对于非常大的 CSV,解决此问题的一种笨方法是查找行数并为 BULK INSERT 使用 LASTROW 设置。有没有更优雅的方式让 MS SQL 知道,是的,最后一行已终止,而不是抱怨或失败?

【问题讨论】:

  • “最后一行”是包含数据的实际行吗?还是带有回车/换行的空白行?
  • 你试过\n吗?
  • 当最后一行的数据以 CR/LF 结尾时文件失败,但当最后一行的数据没有 CR/LF,只有 EOF 时文件成功。 @AaronBertrand:是的,导入适用于 ROWTERMINATOR='\n'!虽然我不明白为什么:我在调查这个时经历了 \n 和/或 \r 的每一次迭代......
  • @AaronBertrand:领取您的奖品,以便我标记答案!也许有一个链接解释为什么 \r 可以工作到最后一行但失败并且 \n 在这种情况下不会失败?
  • 不喜欢提交它作为答案,因为我不知道为什么你的最后一行会丢失\r。可能更好的解决方法是确保创建此文件的任何应用程序都对文件中的每一行应用一致的行尾(通常我们希望 CR + LF => \r\n)。

标签: sql-server csv bulkinsert


【解决方案1】:

使用以下内容:

BULK INSERT import
from 'D:\tail.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a', FIRSTROW = 1)
GO

【讨论】:

    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多