如何从 SQL Server 过程获取所有错误消息

the*_*stv 5 sql sql-server try-catch

在我的程序中,我使用 try catch 块来捕获错误详细信息并记录到日志表中以供将来参考。但使用Error_message()它只能获取最后一条错误消息。

例如,执行以下代码时,它会生成两条错误消息

ALTER TABLE [MFClassProperty]

DROP CONSTRAINT [FK_MFClassProperty_MFProperty]
Run Code Online (Sandbox Code Playgroud)

错误消息是

Msg 3728, Level 16, State 1, Line 161
'FK_MFClassProperty_MFProperty2' is not a constraint.
Msg 3727, Level 16, State 0, Line 161
Could not drop constraint. See previous errors.
Run Code Online (Sandbox Code Playgroud)

使用我的 try catch 块,它只记录最后一条错误消息,通过该消息很难找到问题。

有没有办法获得这两个错误消息[在这种情况下]。

我的 catch 块代码添加在下面

BEGIN CATCH
        ROLLBACK TRANSACTION

        SET NOCOUNT ON

        IF @Debug > 0
        BEGIN
            --------------------------------------------------
            -- INSERTING ERROR DETAILS INTO LOG TABLE
            --------------------------------------------------
            INSERT INTO MFLog (
                SPName
                ,ErrorNumber
                ,ErrorMessage
                ,ErrorProcedure
                ,ErrorState
                ,ErrorSeverity
                ,ErrorLine
                ,ProcedureStep
                )
            VALUES (
                'spName'
                ,Error_number()
                ,Error_message()
                ,Error_procedure()
                ,Error_state()
                ,Error_severity()
                ,Error_line()
                ,@ProcessStep
                )
        END             
    END CATCH
Run Code Online (Sandbox Code Playgroud)

JBo*_*ond 0

我相信这是 SQL Server 的限制,它只会返回最后一条错误消息。

从技术上讲,您收到两个错误:

  • 第3728章'FK_MFClassProperty_MFProperty2'不是约束。
  • 3727无法删除约束。请参阅以前的错误。

因此,SQL Server 返回最后一个。即3727

看看下面的线程:

SQL Server try-catch 内部异常消息难题