2011-07-22 165 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可以在任何需要的方式,(多個)錯誤處理的錯誤代碼。

相關問題