我在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)”的行。
由于前一个错误更能描述问题,因此我想记录这个错误。
答案 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