【问题标题】:Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)"无法从链接服务器“(null)”的 OLE DB 提供程序“BULK”中获取行
【发布时间】: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,但我希望能掌握一两件事。希望有人看到可能非常明显的内容。

【问题讨论】:

    标签: database csv bulk


    【解决方案1】:

    当我的 CSV 中的分隔字段数与表中的列数不同时,我遇到了同样的错误。检查intramerge.csv 中的字段数量是否正确。

    确定有问题的行的方法:

    1. 在电子表格中打开 CSV,为所有数据添加过滤器并查找空值

    这里是列较少的行

    1. 使用此页面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】:

                          请查看您的文件,如果文件末尾有特殊字符或空格,请删除并重试。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2014-05-25
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多