批量插入存在问题

21

我试图将此链接中的数据插入到我的SQL Server中: https://www.ian.com/affiliatecenter/include/V2/CityCoordinatesList.zip

我创建了表。

CREATE TABLE [dbo].[tblCityCoordinatesList](
    [RegionID] [int] NOT NULL,
    [RegionName] [nvarchar](255) NULL,
    [Coordinates] [nvarchar](4000) NULL
) ON [PRIMARY]

我正在运行以下脚本进行批量插入

BULK INSERT tblCityCoordinatesList
FROM 'C:\data\CityCoordinatesList.txt' 
WITH 
( 
    FIRSTROW = 2, 
    MAXERRORS = 0, 
    FIELDTERMINATOR = '|', 
    ROWTERMINATOR = '\n'
)

但是批量插入失败并提示以下错误

Cannot obtain the required interface ("IID_IColumnsInfo") from OLE DB provider "BULK" for linked server "(null)".

当我搜索时,发现有几篇文章说问题可能与RowTerminator有关,但我尝试了所有的选项如\n\r、\n等,但都不起作用。

请问有人能帮我将这些数据插入到我的数据库中吗?

6个回答

65
尝试使用ROWTERMINATOR = '0x0a',应该可以解决问题。

2
太棒了!解决了问题。你能解释一下这个“0x0a”的东西吗?谢谢。 - Sunny Sharma
4
"0x0a" 是 ASCII 字符“换行符”的十六进制值 —— 我不确定为什么它可以生效而 \n(也是“换行符”)却不能…… - Nathan Griffiths
4
我从未理解过的某种原因是,当你输入'\n'时,MSSQL会在其前面添加一个'\r'。 - Tom
为了让这对我起作用,我必须将CSV中的所有行尾换行符改为LF而不是CRLF。 - undefined

22

如果表格和导入文件的列数不匹配,也可能会出现这种情况。


是的,如果你的FIELDTERMINATOR设置错误,就会出现这种情况,就像我的情况一样 :) - Daniel Smolka
一个例子是,当你在脚本中导入多个CSV文件时,你已经检查了第一个文件的格式是否正确,但突然后面的文件包含一个额外的列,而这列在你的导入表中并没有反映。一定要检查所有文件是否存在潜在的列数不匹配问题。 - stackonfire

1
我得到了相同的错误信息,正如你所提到的,它与意外的行结尾有关。 在我的情况下,该行结尾在 fmt 文件中被指定为 Windows 行结尾(CRLF),写成 \r\n,而要处理的数据文件具有 Mac 经典行结尾(CR)。
我用一个可以显示当前行结尾并进行更改的编辑器来解决这个问题。我使用 EditPad Lite,它在底部栏中显示打开文件的行结尾,并按下它允许替换为预期的行结尾。

1
我在使用FORMAT='CSV'选项时,在源文件的每行末尾有一个逗号时,遇到了SQL2019上的这个问题。因此,您需要为您正在BULK插入的表添加一个额外的虚拟字段,以应对源文件中每个记录实际上具有一个空白字段的事实。请注意保留HTML标签。参考上面的CSV文件示例。

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
我不认为这个答案不清楚。它确实帮助了我。 - Tor

0

我遇到了相同的错误,可能是由于文件编码问题引起的。我通过使用Notepad++打开有问题的CSV文件,选择全部内容并复制到剪贴板来解决它。接下来,创建一个新的文本文件(确保它具有CSV文件扩展名),使用Notepad++打开它,然后将文本粘贴到新文件中。保存并关闭所有文件。您应该能够成功地将新的CSV文件加载到SQL服务器中。


-7

你需要从Windows登录运行BULK INSERT命令(而不是从SQL中运行)。现在我没有任何示例。


2
请翻译以下有关编程的内容,从英文到中文。仅返回已翻译的文本:你应该在你的回答中提供示例。谢谢。 - Hazonko
BULK INSERT 在 SQL Operations Studio 中运行得非常好。 - Loke

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