我有一个存储过程PROC
,它接收一些参数。如果其中一个@ID
不为null,则必须执行给定的存储过程PROC_A
。否则,必须执行PROC_B
。问题是它们都可以发出RAISERROR
,我希望通过调用堆栈传播它以在客户端应用程序中显示。但是,RAISERROR
不会停止PROC
存储过程的其余部分,因为我使用的是IF
子句,因此检查IF ( @@ERROR <> 0 ) RETURN
不是一个选项。我唯一的选择似乎是使用TRY...CATCH
块来包装IF
子句并从RAISERROR
块中重新抛出CATCH
,这是很尴尬因为那时我将不得不缓存ERROR_MESSAGE()
,ERROR_SEVERITY()
和ERROR_STATE()
并再次使用RAISERROR
。
难道没有更优雅的方式吗?
答案 0 :(得分: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
中,而不仅仅是外部过程调用。