确定导致大容量插入"unexpected end of file"错误的行?



我正在批量插入:

DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)
DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
  BULK INSERT accn_errors
   FROM ''F:FullUnzippedaccn_errors_201205080105.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;

并收到以下错误:

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)".

有没有办法知道此错误发生在哪一行?

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

要找到麻烦的行,请使用错误文件说明符。

BULK INSERT myData
FROM 'C:......myData.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = 'n',
ERRORFILE = 'C:......myRubbishData.log' 
);

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

有趣,有趣,有趣。 我还没有找到调试这些问题的好方法,所以我使用蛮力。 也就是说,"第一行"和"最后一行"选项非常有用。

从 LastRow = 2 开始,并继续尝试。 将结果加载到一个一次性表中,您可以轻松截断该表。

而且,您还应该记住,第一行也可能给您带来问题。

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

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

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

我遇到此错误。

"链接服务器"(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

干杯。。。梅尔博伊

如果 CHAR(10) 是行终止符,我认为您不能像在批量插入中那样将其放在引号中。不过,有一种未记录的方法可以指示它:

ROWTERMINATOR = '0x0A'
是的

- BULK INSERT 会在其错误消息中提供更多详细信息,而解决此问题的唯一方法是使用蛮力方法,正如 Gordon 正确指出的那样。但是,首先,根据您收到的错误,它要么不理解您的行终止符,要么文件末尾缺少行终止符。使用 FIRSTROW 和 LASTROW 将有助于确定这一点。

因此,您需要执行以下操作:

  1. 检查文件末尾是否有行终止符。如果没有,请放入一个并重试。还要确保最后一行包含所有必需的字段。它说"EOF",那么这就是你的问题。
  2. 您确定每行末尾都有一个 LF 吗?尝试使用 CR(,0x0D),看看是否有效。
  3. 仍然不工作?请尝试设置 LASTROW=2,然后重试。然后尝试 LASTROW=3。如果文件中有超过三行,并且此步骤失败,则行终止符不起作用。

我遇到了同样的问题。我编写了一个 shell 脚本来在 Linux 中创建.csv。我把这个.csv带到了Windows,并尝试批量加载数据。它没有"喜欢"逗号。不要问我为什么,但我在批量导入中更改为 * 作为分隔符,并在我的.csv中用 * 对逗号进行了查找和替换......奏效了..我改成 ~ 作为分隔符,这有效...选项卡也有效 - 它不喜欢逗号....希望这对某人有所帮助。

根据我的经验,这几乎总是由最后两行中的某些内容引起的。 tail导入文件,它仍然应该会给您失败。 然后在全文编辑器中打开它,让您看到非打印字符,如 CR、LF 和 EOF。 这应该使您能够将其投入工作,即使您不知道为什么。 例如,批量插入失败,最后一行出现行终止符

我通过将所有字段转换为字符串,然后使用通用的 FIELDTERMINATOR 来解决这个问题。 这奏效了:

BULK INSERT [dbo].[workingBulkInsert]  
FROM 'C:Datamyfile.txt' WITH (
   ROWTERMINATOR = 'n', 
   FIELDTERMINATOR = ',' 
)

我的数据文件现在如下所示:

"01502","1470"
"01504","686"
"02167","882"
"106354","882"
"106355","784"
"106872","784"

第二个字段是十进制类型,没有双引号分隔符(如 1470.00)。将两者格式化为字符串消除了错误。

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

您需要创建一个表,所有列都应为空并删除最后一行中的空格,仅添加 excel 中可用的列。并且请不要创建主列,此过程不会自动增加身份,这就是创建错误的原因。

我已经完成了这样的批量插入:

CREATE TABLE [dbo].[Department](
    [Deptid] [bigint] IDENTITY(1,1) NOT NULL,
    [deptname] [nvarchar](max) NULL,
    [test] [nvarchar](max) NULL,
 CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED 
(
    [Deptid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE TABLE [dbo].[Table_Column](
    [column1] [nvarchar](max) NULL,
    [column2] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
BULK INSERT Table_Column
FROM 'C:Temp Databulkinsert1.csv'
WITH (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR='n' ,
    batchsize=300000 
);
insert into [dbo].[Department] 
select column1,column2 from Table_Column

如果我将所有字段转换为字符串,然后使用通用的字段分隔符,我就可以解决这个问题。

生成此错误的行没有CHAR(10)终止符或有不必要的空格

最新更新