使用BULK INSERT时出现“列太长”错误

29

我正在尝试运行以下命令,以从CSV文件批量插入数据--

 BULK INSERT TestDB.dbo.patent
 FROM 'C:\1patents.csv'
 WITH (FIRSTROW = 1,  FIELDTERMINATOR = '^', ROWTERMINATOR='\n');

我遇到的错误如下:

Msg 4866,级别16,状态1,第1行
批量加载失败。数据文件中第1行第6列的内容过长。
请验证字段终止符和行终止符是否正确指定。
Msg 7399,级别16,状态1,第1行
链接服务器“(null)”的OLE DB提供程序“BULK”报告了一个错误。该提供程序没有给出有关错误的任何信息。
Msg 7330,级别16,状态2,第1行
无法从链接服务器“(null)”的OLE DB提供程序“BULK”获取一行。

现在这是第一行的数据--

 00000001^^18360713^295^4^0

在表格中,最后一个字段(对应上面数据的第6列= 0)是'int'类型。

我在这里做错了什么?为什么会出现上述错误?


1
通常问题出在行分隔符上。请仔细检查您的分隔符。 - Gulli Meel
4个回答

73

我从Oracle/Unix中进行了数据抽取。我将\r\n替换为ROWTERMINATOR = '0x0a',这样就可以正常工作了。
非常感谢!


这对我有所帮助,适用于平面文件具有文本限定符“ ”和字段终止符;的情况。 - Martin Widlund
这在每种情况下都能正常工作吗?还是有任何例外情况? - Manish Rawat

35

如上所述,我曾经遇到导入csv文件到SQL Server的问题。 我使用了 ROWTERMINATOR = '\n' 以及尝试使用 '\r\n''\r',但没有一个有效。

但是,当使用 ROWTERMINATOR = '0x0a' 时,表格可以成功加载。

我不知道背后的原因是什么,希望其他人能够解释一下。


0x0a是十六进制的换行符LF。Unix使用LF(仅此)作为换行符,而不是Windows标准的CR/LF。 - undefined

4

除非文件来源是Unix,否则该文件的行终止符很可能是

\r\n

要么使用十六进制编辑器验证文件的终止符,要么只需将其作为行终止符尝试即可。


我尝试使用你建议的终止符,但仍然遇到相同的错误?如果您有任何进一步的想法来帮助解决这个问题,请告诉我...谢谢... - Arvind
16
这里有一个答案:https://dev59.com/R3RB5IYBdhLWcg3w4bEo#4207050建议使用ROWTERMINATOR = '0x0a'如果'\n'或'\r\n'对你不起作用。这对我起作用了! - Sean Fahey

2
我遇到了类似的问题,发现除非文件是UNIX类型\r\n没关系.

生成格式文件(.fmt或.xml)时,请注意从左边数第三列。它称为列的最小长度。有时sql server默认为2,即使您在创建脚本中没有提及。将该值更改为0。有时您可能也需要允许NULL,所以将其更改为零,然后它应该能够正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接