SQL Capture BULK INSERT错误4863

时间:2013-12-03 16:20:12

标签: sql-server error-handling try-catch

我在try-catch块中有一个批量插入:

BEGIN TRY
    BULK INSERT dbo.EQUIP_STATUS_CODE
    FROM 'filepath\filename.csv'
    WITH ( MAXERRORS = 1,  FIELDTERMINATOR = ',')
END TRY 
BEGIN CATCH
    EXECUTE  dbo.ERROR_LOG_CSV;
END CATCH

我希望能够在发生时捕获以下错误:

  

批量加载数据转换错误(截断)

但似乎我不能,即使等级是16,它属于try-catch范围。我想知道是否有办法在发生错误时捕获此错误。

在我将MAXERRORS指定为1之前,我收到了此错误:

  

无法从OLE DB提供程序“BULK”获取链接服务器“(null)”的行。

由于前一个错误更能描述问题,因此我想记录这个错误。

3 个答案:

答案 0 :(得分:4)

虽然我的能力比SQL Server更多,但无论如何我会尝试以某种方式解决这个问题。我发现你的情况已经在SQL Server的bugtracker(bug id:592960)中,自2010年以来状态为“无法修复”。你可以在connect.microsoft.com自己看到相应的讨论(目前主持人是无法访问所以我使用google cache)。

答案 1 :(得分:2)

亚历山大给了你答案,但你必须非常仔细地阅读错误日志,并考虑可能发生的事情。 SQL Server(错误ID:592960

您是否尝试直接从数据文件批量插入数据表?

从文章中可以看出,数据类型或截断不匹配。 SQL引擎有一个错误,不会将此报告为错误。

引用第一个报告错误的人 - “尽管严重程度为16,但我没有看到错误被TRY / CATCH构造捕获。代码没有中断并且顺利进行,好像没有错误已经发生了。“

您是否调查了可能包含错误数据的字段?

以下是一些建议。

1 - COMMA DELIMITED FILES有问题 - 我总是讨厌以逗号分隔的格式,因为逗号可以在数据流中。尝试使用像tilde~这样的字符作为分隔符,这种分隔符不常发生。问题可能是文本字段中有逗号吗?那么在数据流中添加一个字段?

2 - 使用分页表 - 有时最好将数据从文件导入到使用列定义为varchar(x)的临时表中。这允许数据进入表格。

然后编写存储过程以在传输到生产表之前验证列中的数据。将任何坏行标记为可疑。

将临时表中的数据插入到生产中,留下任何不良行。

发送电子邮件给某人查看错误数据。如果这是重新发生的数据文件传输,您将需要在源处修复它。

3 - 使用ETL工具进行REWRITE处理 - 跳过在引擎中写入这些内容。 SQL Server Integration Services(SSIS)是一个很棒的Extract Translate Load(ETL)工具。

连接中有一些选项可以声明文本引用“”,从而消除了上述额外的逗号问题。您可以将无法导入生产表的行发送到医院表进行审核。

总之,引擎中存在错误。

但是,我肯定会考虑更改为波浪形格式文件和/或使用临时表。更好的是,如果你有时间,用SSIS包重写过程!

此致

Ĵ

PS:因为他确实发现了SQL连接上的错误,所以我给了Alexander点数。但是,我认为文件的格式是根本原因

答案 2 :(得分:0)

这可能会捕获此错误,因为它捕获了错误消息4860:

问: TRY doesn't CATCH error in BULK INSERT

BEGIN TRY
  DECLARE @cmd varchar(1000)
  SET @cmd = 'BULK INSERT [dbo].[tblABC] 
  FROM ''C:\temp.txt'' 
  WITH (DATAFILETYPE = ''widechar'',FIELDTERMINATOR = '';'',ROWTERMINATOR = ''\n'')'
  EXECUTE (@cmd)
END TRY

BEGIN CATCH
 select error_message()
END CATCH