无法从链接服务器“(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" 指示该对象没有列,或当前用户没有访问该对象的权限。

链接服务器的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 外加SQL事务死锁问题

无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务