26

我尝试使用 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,但我希望能抓住一两件事。希望有人看到什么可能非常明显。

4

15 回答 15

18

复活一个老问题,但万一这对其他人有帮助:经过多次反复试验,我终于(终于!)能够通过改变这个来摆脱这个错误:

ROWTERMINATOR = '\n'

对此:

ROWTERMINATOR = '0x0A'
于 2015-11-13T22:40:28.217 回答
15

我有同样的问题。

解决方案:

在 notepad+ 等文本编辑器中验证 CSV 或文本文件。最后一行可能不完整。去掉它。

于 2014-10-22T14:23:47.747 回答
8

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

确定有问题的行的方法:

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

在此处输入图像描述

这是列较少的行 在此处输入图像描述

  1. 使用此页面https://csvlint.com创建您的验证规则,您也可以在 CSV 中检测您的问题。

在此处输入图像描述

于 2013-05-22T20:17:51.097 回答
4

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

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

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

如果它出错了,它不会提供任何关于原因的线索。微软,你在这方面的无能让我感到难过。

微软,也许会添加一些错误消息,所以它说为什么它拒绝它?因为如果你不知道它失败的原因,几乎不可能解决这个问题!

于 2019-09-01T12:14:02.803 回答
3

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

于 2015-11-24T15:34:38.653 回答
2

这是一个古老的问题,但似乎我的发现会启发其他一些有类似问题的人。

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

于 2014-02-13T18:10:25.150 回答
1

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

或者,当文件被分隔时,我在空白行中添加了正确数量的分隔符,这再次允许文件成功导入 - 如果需要加载空白行,请使用此选项。

于 2019-10-02T09:35:07.503 回答
1

这可能是一个完整的 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 可能由于其他原因仍然失败。

于 2017-03-24T20:07:51.437 回答
1

当我的 SQL 表中的 char 字段对于输入的文本来说太小时,我得到了这个异常。尝试使列更大。

于 2016-09-05T09:25:04.757 回答
0

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

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

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

于 2021-04-29T18:29:18.563 回答
0

Please look at your file, if any special characters or spaces at end of the file, then remove and try again.

于 2021-09-27T06:21:53.197 回答
0

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

于 2020-11-18T15:03:37.527 回答
0

我也发生了同样的事情,原来这是由于重复的列名。将列重命名为唯一。&它工作正常

于 2021-09-09T07:33:21.947 回答
0

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

例如:我尝试将十进制值导入浮点字段。但由于这些值都有一个逗号作为小数点,因此无法将它们插入表中(它需要一个点)。

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

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

于 2020-03-09T11:19:01.143 回答
0

我只想分享我对此的解决方案。问题是表列的大小,使用 varchar(255) 并且都应该工作。

于 2018-06-22T12:38:30.037 回答