无法从OLE DB提供程序“BULK”获取链接服务器“(null)”的行

时间:2012-08-27 17:49:06

标签: database csv bulk

我尝试使用大小为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

我尝试构建一个包含大量库存报价的数据库。但我收到此错误消息:

  

Msg 4832,Level 16,State 1,Line 2批量加载:意外结束   在数据文件中遇到了文件。 Msg 7399,Level 16,State 1,   第2行报告链接服务器“(null)”的OLE DB提供程序“BULK”   一个错误。提供商没有提供任何有关的信息   错误。消息7330,级别16,状态2,行2无法从中获取行   OLE DB提供程序“BULK”用于链接服务器“(null)”

我对SQL不太了解,但我希望能抓到一两件事。希望有人看到可能非常明显的东西。

13 个答案:

答案 0 :(得分:12)

我有同样的问题。

解决方案:

验证文本编辑器中的CSV或文本文件,例如记事本+。最后一行可能不完整。删除它。

答案 1 :(得分:11)

重新提出一个旧问题,但如果这有助于其他人:经过多次试错,我终于(终于!)能够通过改变这个来摆脱这个错误:

ROWTERMINATOR = '\n'

对此:

ROWTERMINATOR = '0x0A'

答案 2 :(得分:6)

当我在CSV中有不同数量的分隔字段而不是我在表格中的列时,我得到了同样的错误。检查intramerge.csv中是否包含正确数量的字段。

答案 3 :(得分:2)

当我的格式文件(即使用FORMATFILE参数指定)的列宽小于实际列大小(例如varchar(50)而不是varchar(100))时出现此错误

答案 4 :(得分:1)

这是一个老问题,但似乎我的发现会让其他人遇到类似的问题。

默认SSIS超时值似乎为30秒。这使得包中的任何服务绑定或IO绑定操作远远超出该超时值并导致超时。增加超时值(无超时更改为“0”)将解决问题。

答案 5 :(得分:1)

当我的SQL表中的char字段太小而无法进入文本时,我遇到了这个异常。尝试使列更大。

答案 6 :(得分:1)

我遇到了类似的问题,但是在这种情况下,正在加载的文件包含一些空白行。删除空白行即可解决。

或者,随着文件的定界,我在空行中添加了正确数量的定界符,这再次使文件成功导入-如果需要加载空行,请使用此选项。

答案 7 :(得分:0)

这可能是一个坏主意,完整的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 :(得分:0)

我只想分享我的解决方案。问题在于表列的大小,请使用varchar(255),所有方法都应该起作用。

答案 9 :(得分:0)

这是我的解决方案:放弃。

我总是最终使用SSMS和[ Tasks > Import Data ]

从不设法使用此方法导入真实世界的.csv文件。这是完全没用的功能,仅适用于现实世界中不存在的原始数据集。也许我从来没有碰过运气,因为我处理的数据集很杂乱并且是由第三方生成的。

如果出错,则不会提供任何线索。微软,您在这方面的无能使我感到悲伤。

Microsoft,也许会添加一些错误消息,所以它说为什么拒绝了它?因为如果您不知道为什么失败,几乎不可能解决该问题!

答案 10 :(得分:0)

批量插入不会告诉您导入值是否“适合”目标表的字段格式。

例如:我试图将十进制值导入浮点字段。但是,由于所有值都以逗号作为小数点,因此无法将它们插入到表中(期望有一个点)。

当提供的CVS值是从Excel文件导出时,通常会发生这些意外结果。将Excel文件保存为CSV时,计算机的区域设置将决定使用哪个小数点。不同人提供的CSV会导致不同的结果。

解决方案:将所有字段导入为VARCHAR,然后尝试处理这些值。

答案 11 :(得分:0)

如果文件列用“;”分隔,也会发生这种情况但是您将“,”用作FIELDTERMINATOR(或者相反)

答案 12 :(得分:0)

对于碰巧遇到这篇文章的任何人,我的问题是对语法的一个简单疏忽。我将它与一些 Python 内联,并将其直接带入 SSMS:

BULK 
INSERT access_log
FROM '[my path]'
WITH (FIELDTERMINATOR = '\\t', ROWTERMINATOR = '\\n');

当然,问题在于 Python 中需要的双反斜杠,因为我将其作为字符串嵌入脚本中的方式。更正 '\t''\n' 显然修复了它。