Sql-Server
如何回滾 SQL Server 事務並使用輸出參數?
我正在嘗試在儲存過程中設置輸出參數,但我認為當我回滾事務時,我認為我也在將分配回滾到
@out
. 那是對的嗎?如果是這樣,我如何返回消息並回滾事務?我正在
@out
從 C# 獲取參數。create PROCEDURE [dbo].[sp] @out varchar(2000) output AS BEGIN SET NOCOUNT ON BEGIN TRANSACTION BEGIN TRY SET @OUT = "success"; COMMIT TRANSACTION END TRY BEGIN CATCH set @out = 'not success'; ROLLBACK TRANSACTION END CATCH END
我最初是在做一個
SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage;
…但這並沒有幫助,儘管我更喜歡這種方法。
編寫此儲存過程的更可靠的方法是:
CREATE PROCEDURE dbo.sp AS BEGIN SET XACT_ABORT, NOCOUNT ON; BEGIN TRY BEGIN TRANSACTION; SELECT 1/0; -- An error! /* Other good code omitted*/ COMMIT TRANSACTION; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; DECLARE @Message nvarchar(2048) = ERROR_MESSAGE(); DECLARE @Severity integer = ERROR_SEVERITY(); DECLARE @State integer = ERROR_STATE(); RAISERROR(@Message, @Severity, @State); RETURN -1; END CATCH; END;
注意
XACT_ABORT
在BEGIN TRY
. 由於以下參考文獻中涵蓋的原因,RAISERROR
通常更喜歡也,但重要的是:THROW
與 RAISERROR 不同的是,;THROW 總是中止批處理。
中止批處理會導致未分配任何輸出參數。
SQL Server 中的錯誤處理極其古怪,因此我鼓勵您查看 Erland Sommarskog 所撰寫的關於該主題的開創性工作:SQL Server 中的錯誤和事務處理。