如何在TRY..CATCH中记录多个错误?

时间:2017-10-05 19:54:29

标签: sql-server sql-server-2012

我的应用程序运行SQL脚本来加载数据,当它加载的文件出现问题时,它只记录最后一个错误,该错误不包含有关文件无法加载的有用信息。

示例代码:

BEGIN TRY
    BULK INSERT MyTableName
    FROM 'C:\MyFilename.txt'
    WITH
    (
    FIELDTERMINATOR = '|',
    ROWTERMINATOR = '\n',
    TABLOCK, 
    MAXERRORS=0,
    ERRORFILE = 'C:\MyFilename_Errors.log'
    )
    ;
END TRY
BEGIN CATCH
    INSERT INTO MyErrorLog
    SELECT ERROR_MESSAGE() as Issue
    , ERROR_LINE() as IssueRowNum
    ;
END CATCH

此脚本将在[MyErrorLog]中为第三个错误创建一个条目(见下文)。日志文件会告诉我什么行,但不是什么字段:

  

行30539文件偏移1910820 ErrorFile偏移0 - HRESULT 0x80004005

如果我“删除”CATCH中的错误,这里有3行:

  

Msg 4864,Level 16,State 1,Line 3批量加载数据转换错误   (为指定的代码页键入不匹配或无效字符)   第1行第5列(MyField)。

     

Msg 7399,Level 16,State 1,Line 3 OLE DB提供程序“BULK”for   链接服务器“(null)”报告错误。提供者没有给出   有关错误的任何信息。

     

消息7330,级别16,状态2,行3无法从OLE DB中获取行   提供者“BULK”用于链接服务器“(null)”。

如何捕获第一条(和第二条)错误消息?

1 个答案:

答案 0 :(得分:1)

您只能捕获T-SQL CATCH块中的单个错误。根据{{​​3}},解决方法是使用proto(或不使用TRY / CATCH)并捕获客户端代码中的错误。

因此,您需要从客户端应用程序(包括SQLCLR)调用脚本,以便捕获并记录所有错误。