调用另一个存储过程的存储过程中的异常流

时间:2011-07-22 14:01:39

标签: sql-server tsql stored-procedures raiserror

我有一个调用另一个存储过程的存储过程。 SP2有一个try / transaction / catch / rollback / raiserror。如果SP2引发错误,它会通过SP1冒泡到调用者,还是我必须在try / catch中将调用嵌套到SP2?如果是后者,我怎样才能确保在启动/退出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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

你应该在dbo.storedProc2

中陷阱和处理错误

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

然后,

SP1可以以任何方式处理该错误。