2011-07-01 67 views
2

我有一個存儲過程,PROC,它接收一些參數。如果其中的一個@ID不爲空,則必須執行給定的存儲過程PROC_A。否則,必須執行PROC_B。問題是它們都可能發出RAISERROR,我想通過調用堆棧傳播以顯示在客戶端應用程序中。但是,RAISERROR不會像其應該的那樣停止PROC存儲過程的其餘部分,並且由於我使用的是IF子句,因此檢查IF (@@ERROR <> 0) RETURN也不是一個選項。我唯一的選擇似乎是使用TRY...CATCH塊包裹IF條款,並從CATCH塊,這是捉襟見肘內再次引發RAISERROR因爲那時我將不得不緩存ERROR_MESSAGE()ERROR_SEVERITY()ERROR_STATE()並再次使用RAISERRORIF,RAISERROR&RETURN中的存儲過程

難道真的沒有更優雅的方式嗎?

回答

7

只使用一個TRY - CATCH塊並回原來的錯誤,這並不難做到:

BEGIN TRY 
    --used in the CATCH block to echo the error back 
    DECLARE @ErrorMessage nvarchar(400), @ErrorNumber int, @ErrorSeverity int, @ErrorState int, @ErrorLine int 

    --Your stuff here 

END TRY 
BEGIN CATCH 

    --your error code/logging here 

    --will echo back the complete original error message 
    SELECT @ErrorMessage = N'Error %d, Line %d, Message: '+ERROR_MESSAGE(),@ErrorNumber = ERROR_NUMBER(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(),@ErrorLine = ERROR_LINE() 
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber,@ErrorLine) 

END CATCH 

而且,它是有一個TRY - CATCH你的整個過程中的最佳實踐,而不是隻外部程序調用。

+3

+1我將無恥地鏈接到我的模板http://stackoverflow.com/questions/2073737/nested-stored-procedures-containing-try-catch-rollback-pattern/2074139#2074139 – gbn