gpt4 book ai didi

sql-server-2005 - 存储过程中的 IF、RAISERROR 和 RETURN

转载 作者:行者123 更新时间:2023-12-01 09:36:36 25 4
gpt4 key购买 nike

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

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

最佳答案

只需使用 TRY - CATCH block 并回显原始错误,这并不难:

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 中,而不仅仅是外部过程调用。

关于sql-server-2005 - 存储过程中的 IF、RAISERROR 和 RETURN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com