在BULK INSERT中确定导致"意外的文件结束"错误的ROW?

l--*_*''' 22 sql sql-server bulkinsert sql-server-2008

我正在做一个批量插入:

DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)

DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
  BULK INSERT accn_errors
   FROM ''F:\FullUnzipped\accn_errors_201205080105.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;
Run Code Online (Sandbox Code Playgroud)

并收到以下错误:

Msg 4832, Level 16, State 1, Line 2
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 2
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 2
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
Run Code Online (Sandbox Code Playgroud)

有没有办法知道这个错误发生在哪个ROW?

我能够毫无问题地导入10,000,000行,之后会发生错误

小智 48

要找到麻烦的行,请使用errorfile说明符.

BULK INSERT myData
FROM 'C:\...\...\myData.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
ERRORFILE = 'C:\...\...\myRubbishData.log' 
);
Run Code Online (Sandbox Code Playgroud)

myRubbishData.log将包含违规行和伴随文件myRubbishData.log.txt将为您提供行号和偏移到文件中.

伴随文件示例:

Row 3 File Offset 152 ErrorFile Offset 0 - HRESULT 0x80004005
Row 5 File Offset 268 ErrorFile Offset 60 - HRESULT 0x80004005
Row 7 File Offset 384 ErrorFile Offset 120 - HRESULT 0x80004005
Row 10 File Offset 600 ErrorFile Offset 180 - HRESULT 0x80004005
Row 12 File Offset 827 ErrorFile Offset 301 - HRESULT 0x80004005
Row 13 File Offset 942 ErrorFile Offset 416 - HRESULT 0x80004005
Run Code Online (Sandbox Code Playgroud)

  • 偏移量是什么意思?我如何使用来自 HRESULT 的指针来纠正我的问题? (2认同)

Gor*_*off 5

有趣,有趣,有趣.我没有找到调试这些问题的好方法,所以我使用暴力.也就是说,FirstRow和LastRow选项非常有用.

从LastRow = 2开始并继续尝试.将结果加载到丢弃表中,您可以轻松截断.

而且,您还应该记住,第一行也可能导致您遇到问题.


小智 5

我有一个使用批量导入的 csv 文件

BULK INSERT [Dashboard].[dbo].[3G_Volume]
FROM 'C:\3G_Volume.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '","',
ROWTERMINATOR = '\n'
)
GO
Run Code Online (Sandbox Code Playgroud)

通常我使用这个脚本,它没有问题,但在极少数情况下。

我遇到这个错误..

“链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了一个错误。提供程序没有提供有关该错误的任何信息。

通常,当最后一行具有空白值(null)时会发生这种情况。

您需要在 MS access db 中链接您的 csv 文件以检查数据..(如果您的 csv 不超过 140 万行,您可以在 excel 中打开它)

由于我的数据大约有 300 万行,因此我需要使用访问数据库。

然后用空白检查最后一行的数量,并将空行数减去 csv 的总行数。

如果最后有 2 个空白行并且总行数为 30000005 脚本将变成这样..

BULK
INSERT [Dashboard].[dbo].[3G_Volume]
 FROM 'C:\3G_Volume.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '","',
ROWTERMINATOR = '\n',
Lastrow = 30000003
)
GO
Run Code Online (Sandbox Code Playgroud)

干杯... Mhelboy