IF,RAISERROR&RETURN in Stored Procedure

Use*_*ser 3 stored-procedures sql-server-2005 return raiserror

我有一个存储过程PROC,它接收一些参数.如果其中一个@ID不是null PROC_A,则必须执行给定的存储过程.否则,PROC_B必须执行.问题是它们都可以发出一个RAISERROR,我希望通过调用堆栈传播,以便在客户端应用程序中显示.但是,这RAISERROR不会停止PROC存储过程的其余部分,因为我使用的是IF子句,因此检查IF ( @@ERROR <> 0 ) RETURN也不是一种选择.我唯一的选择似乎是使用一个TRY...CATCH块来包装IF子句并RAISERRORCATCH块中重新抛出from ,这很麻烦因为那时我将不得不缓存ERROR_MESSAGE(),ERROR_SEVERITY()并 再次ERROR_STATE()使用RAISERROR.

真的没有更优雅的方式吗?

KM.*_*KM. 8

只需使用一个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
Run Code Online (Sandbox Code Playgroud)

此外,最好将整个过程放在一个TRY - CATCH,而不仅仅是外部过程调用.

  • +1我将无耻地链接到我的模板http://stackoverflow.com/questions/2073737/nested-stored-procedures-containing-try-catch-rollback-pattern/2074139#2074139 (3认同)