嵌套存储过程异常处理

时间:2015-08-07 10:50:59

标签: stored-procedures error-handling sql-server-2008-r2

我有一个问题..在每个存储过程中我都有

BEGIN TRY

命令和每个异常我登录到错误表。 但是现在我需要在另一个存储过程中执行存储过程,并且我意识到嵌套异常被填充到父存储过程中并且之后被记录。

这是我在每个存储过程中的CATCH构造

BEGIN
BEGIN TRY
    BEGIN TRANSACTION;

<CODE>

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;

        ...
        INSERT INTO ErrorLog (ObjectName...)
        VALUES (OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)...)

        RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH

示例场景可能是

SP1 =&gt; Fires SP2 =&gt; Fires SP3 =&gt; Fires SP4 =&gt;消防SP5

如果在SP4中发生错误,则插入错误表

SP1 : Error message from SP4
SP2 : Error message from SP4
SP3 : Error message from SP4

所以问题在于我需要 SP4:来自SP4的错误消息 如果有可能我不需要

SP1 : Error message from SP4
SP2 : Error message from SP4
SP3 : Error message from SP4

错误表中的行。

我做错了什么,错误处理的最佳做法是什么?

有时我也会收到错误

The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。只有最后一个嵌套事务才会记录它。 但是,如果调用SP1的代码创建自己的事务,我认为这个解决方案并不好。 @@ TRANCOUNT将>&1;代码必须处理日志。

BEGIN CATCH
    Declare @count int
    Set @count = @@TRANCOUNT

    ROLLBACK TRANSACTION;

    ...

    If (@count = 1) 
    Begin
        INSERT INTO ErrorLog (ObjectName...)
        VALUES (OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)...)
    End
    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH