我尝试使用大小为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不太了解,但我希望能抓到一两件事。希望有人看到可能非常明显的东西。
答案 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'
显然修复了它。