2011-07-22 131 views
2

我有一个调用另一个存储过程的存储过程。 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

你需要有一个外TRY/CATCH块。

如果您只有SP2中的错误陷阱,当SP2错误时它会中止。
然后,它会将错误代码传回到SP1,但在大多数情况下SP1将继续执行(例外情况是严重性错误20-25)。

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

+0

在我的问题的例子中,错误会引发到SP1中的@Err变量吗? –

+0

@AJ - 我不这么认为,除非你为每个SP调用使用返回码和输出参数。 – JNK

0

你应该陷阱,并与错误处理WITHIN dbo.storedProc2

然后返回使用返回N法然后

SP1可以在任何需要的方式,(多个)错误处理的错误代码。

相关问题