无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行
Posted
技术标签:
【中文标题】无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行【英文标题】:Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)" 【发布时间】:2012-08-22 05:34:34 【问题描述】:我尝试使用 1.4 GB 大小的 .csv 文件中的大量数据加载我的数据库。但是当我尝试运行我的代码时,我得到了错误。
这是我的代码:
USE [Intradata NYSE]
GO
CREATE TABLE CSVTest1
(Ticker varchar(10) NULL,
dateval date NULL,
timevale time(0) NULL,
Openval varchar(10) NULL,
Highval varchar(10) NULL,
Lowval varchar(10) NULL,
Closeval varchar(10) NULL,
Volume varchar(10) NULL
)
GO
BULK
INSERT CSVTest1
FROM 'c:\intramerge.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTest1
GO
--Drop the table to clean up database.
DROP TABLE CSVTest1
GO
我尝试建立一个包含大量股票报价的数据库。但我收到此错误消息:
消息 4832,级别 16,状态 1,行 2 批量加载:意外结束 在数据文件中遇到文件。消息 7399,级别 16,状态 1, 第 2 行报告链接服务器“(null)”的 OLE DB 提供程序“BULK” 一个错误。提供者没有提供任何关于 错误。消息 7330,级别 16,状态 2,行 2 无法从中获取行 链接服务器“(null)”的 OLE DB 提供程序“BULK”
我不太了解 SQL,但我希望能掌握一两件事。希望有人看到可能非常明显的内容。
【问题讨论】:
【参考方案1】:当我的 CSV 中的分隔字段数与表中的列数不同时,我遇到了同样的错误。检查intramerge.csv
中的字段数量是否正确。
确定有问题的行的方法:
-
在电子表格中打开 CSV,为所有数据添加过滤器并查找空值
这里是列较少的行
-
使用此页面https://csvlint.com 创建验证规则,您也可以在 CSV 中检测问题。
【讨论】:
【参考方案2】:这是一个老问题,但我的发现似乎会启发其他有类似问题的人。
默认 SSIS 超时值似乎是 30 秒。这使得包中的任何服务绑定或 IO 绑定操作都远远超出该超时值并导致超时。增加该超时值(更改为“0”表示没有超时)将解决该问题。
【讨论】:
【参考方案3】:我有同样的问题。
解决方案:
在记事本+等文本编辑器中验证 CSV 或文本文件。最后一行可能不完整。删除它。
【讨论】:
【参考方案4】:复活一个老问题,但万一这对其他人有帮助:经过多次反复试验,我终于(终于!)能够通过改变这个来摆脱这个错误:
ROWTERMINATOR = '\n'
到这里:
ROWTERMINATOR = '0x0A'
【讨论】:
这对我有用。此外,我建议在 CMD 中运行more
命令来检查较大文件的末尾是否存在页脚或问题。如果您执行more +n [filename]
,CMD 将显示n
之后的所有行,使用它来检查文件末尾附近。【参考方案5】:
当我的格式文件(即使用FORMATFILE
参数指定)的列宽小于实际列大小(例如varchar(50)
而不是varchar(100)
)时,我收到此错误。
【讨论】:
对我来说类似的情况,将列的int
数据类型更改为bigint
可以解决问题。但是我认为这应该会引发overflow
错误。
对我来说也一样。与列大小无关,但格式文件不正确。【参考方案6】:
当我的 SQL 表中的 char 字段对于输入的文本来说太小时,我遇到了这个异常。尝试使列更大。
【讨论】:
【参考方案7】:这可能是一个完整的 1.5GB 的坏主意,但您可以在一个子集上尝试它(从几行开始):
CREATE TABLE CSVTest1
(Ticker varchar(MAX) NULL,
dateval varchar(MAX) NULL,
timevale varchar(MAX) NULL,
Openval varchar(MAX) NULL,
Highval varchar(MAX) NULL,
Lowval varchar(MAX) NULL,
Closeval varchar(MAX) NULL,
Volume varchar(MAX) NULL
)
... 进行 BULK INSERT,然后
SELECT MAX(LEN(Ticker)),
MAX(LEN(dateval)),
MAX(LEN(timevale)),
MAX(LEN(Openval)),
MAX(LEN(Highval)),
MAX(LEN(Lowval)),
MAX(LEN(Closeval)),
MAX(LEN(Volume))
这将有助于告诉您您对列的估计是否有偏差。您可能还会发现您的列有问题,或者 BULK INSERT 可能仍因其他原因而失败。
【讨论】:
【参考方案8】:我只想分享我对此的解决方案。问题是表列的大小,使用 varchar(255) 并且都应该工作。
【讨论】:
【参考方案9】:这是我的解决方案:放弃吧。
我总是最终使用 SSMS 和 [ Tasks > Import Data ]
。
我从来没有设法使用此方法导入真实世界的 .csv 文件。这是完全无用的功能,仅适用于现实世界中不存在的原始数据集。也许我从来没有运气,因为我处理的数据集非常混乱,并且是由第三方生成的。
如果它出错了,它不会提供任何关于原因的线索。微软,你在这方面的无能让我感到难过。
Microsoft,也许会添加一些错误消息,所以它说 为什么 它拒绝了它?因为如果你不知道它失败的原因,几乎不可能解决这个问题!
【讨论】:
【参考方案10】:我遇到了类似的问题,但在这种情况下,正在加载的文件包含一些空白行。删除空白行解决了它。
或者,当文件被分隔时,我在空白行中添加了正确数量的分隔符,这再次允许文件成功导入 - 如果需要加载空白行,请使用此选项。
【讨论】:
【参考方案11】:批量插入不会告诉您导入值是否“适合”目标表的字段格式。
例如:我尝试将十进制值导入浮点字段。但是由于这些值都有一个逗号作为小数点,因此无法将它们插入到表中(它需要一个点)。
当提供的 CVS 值是从 Excel 文件导出时,通常会发生这些意外结果。将 Excel 文件保存为 CSV 时,您计算机的区域设置将决定使用哪个小数点。不同人提供的 CSV 会导致不同的结果。
解决方法:将所有字段导入为 VARCHAR,然后尝试处理这些值。
【讨论】:
【参考方案12】:如果您的文件列用“;”分隔,也会发生这种情况但是您使用“,”作为 FIELDTERMINATOR(或相反)
【讨论】:
【参考方案13】:对于碰巧看到这篇文章的任何人,我的问题是对语法的简单疏忽。我将它与一些 Python 内联,并将其直接带入 SSMS:
BULK
INSERT access_log
FROM '[my path]'
WITH (FIELDTERMINATOR = '\\t', ROWTERMINATOR = '\\n');
当然,问题在于 Python 中需要双反斜杠,因为我将它作为字符串嵌入到脚本中。更正为'\t'
和'\n'
显然修复了它。
【讨论】:
【参考方案14】:我也遇到了同样的情况,原来这是由于重复的列名。将列重命名为唯一。 &它工作正常
【讨论】:
请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。【参考方案15】:请查看您的文件,如果文件末尾有特殊字符或空格,请删除并重试。
【讨论】:
以上是关于无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行的主要内容,如果未能解决你的问题,请参考以下文章
无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象
SQL Server:无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象
无法执行操作,因为链接服务器的 OLE DB 提供程序“SQLNCLI11”无法开始分布式事务
链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI11" 指示该对象没有列,或当前用户没有访问该对象的权限。