Sql-Server

如何回滾 SQL Server 事務並使用輸出參數?

  • June 5, 2018

我正在嘗試在儲存過程中設置輸出參數,但我認為當我回滾事務時,我認為我也在將分配回滾到@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_ABORTBEGIN TRY. 由於以下參考文獻中涵蓋的原因,RAISERROR通常更喜歡也,但重要的是:THROW

與 RAISERROR 不同的是,;THROW 總是中止批處理。

中止批處理會導致未分配任何輸出參數。

SQL Server 中的錯誤處理極其古怪,因此我鼓勵您查看 Erland Sommarskog 所撰寫的關於該主題的開創性工作:SQL Server 中的錯誤和事務處理

引用自:https://dba.stackexchange.com/questions/208770