我有一个调用另一个存储过程的存储过程。 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
答案 0 :(得分:3)
您需要有一个外部TRY/CATCH
阻止。
如果您在SP2中只有错误捕获,当SP2错误时它将中止 然后它将错误代码传递回SP1,但SP1将在大多数情况下继续执行(异常将是致命错误,严重性为20-25)。
没有使用TRY/CATCH
没有真正的固有错误陷阱(如果你是老派,则检查@@Error
) - 代码将继续执行,无论好坏。
答案 1 :(得分:0)
你应该在dbo.storedProc2
中陷阱和处理错误然后使用return n方法返回错误代码
然后,SP1可以以任何方式处理该错误。