【问题标题】:Exception flow in a stored procedure calling another stored procedure存储过程中的异常流调用另一个存储过程
【发布时间】:2011-07-22 14:01:38
【问题描述】:

我有一个调用另一个存储过程的存储过程。 SP2 有一个 try/transaction/catch/rollback/raiserror。如果 SP2 引发错误,它会通过 SP1 冒泡到调用者,还是我必须将对 SP2 的调用嵌套在 try/catch 中?如果是后者,我如何确保在提升/退出 SP1 时不会杀死来自 SP2 的错误的“堆栈跟踪”?

-- 这会冒泡 SP2 的任何错误并退出 SP1 吗?

EXEC dbo.storedProc2 @someParameter = @someValue 

--或者我需要这样做吗?

BEGIN TRY
    EXEC dbo.storedProc2 @someParameter = @someValue
END TRY
BEGIN CATCH
    -- this is what I normally do in a simple catch/raise scenario:
    -- will it kill the error stack?
    DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT, @ErrState INT, @ErrLine INT
    SELECT @ErrMsg = ERROR_MESSAGE() + '  Line %d', 
           @ErrSeverity = ERROR_SEVERITY(), 
           @ErrState = ERROR_STATE(),
           @ErrLine = ERROR_LINE()
    RAISERROR(@ErrMsg, @ErrSeverity, @ErrState, @ErrLine)
END CATCH

【问题讨论】:

    标签: sql-server tsql stored-procedures raiserror


    【解决方案1】:

    您需要有一个外部 TRY/CATCH 块。

    如果您在 SP2 中只有错误捕获,则当 SP2 出错时,它将中止。
    然后它将错误代码传递回 SP1,但在大多数情况下 SP1 将继续执行(例外情况是严重性为 20-25 的致命错误)。

    如果不使用TRY/CATCH(或者如果您是老派,则检查@@Error)没有真正的固有错误捕获 - 代码将继续执行,无论好坏。

    【讨论】:

    • 在我的问题示例中,SP1 中的@Err 变量会引发错误吗?
    • @AJ - 我不这么认为,除非您为每个 SP 调用使用返回码和输出参数。
    【解决方案2】:

    您应该在 dbo.storedProc2 中捕获并处理错误

    然后使用return n方法返回错误码

    SP1 然后可以以任何需要的方式处理该错误。

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多