我有兩個程序,一個外部程序和一個內部程序,我想了解錯誤處理的行為。內部程序引發錯誤并試圖將 catch 塊中的某些內容插入到表中。之后引發錯誤,傳遞給外部程序,然后應該回滾事務。
我試圖了解為什么我的代碼會拋出錯誤訊息:
Msg 50000, Level 11, State 1, Procedure dbo.OuterProcedure, Line 21 [Batch Start Line 9]
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
我希望收到以下訊息:
Msg 50000, Level 11, State 1, Procedure dbo.OuterProcedure, Line 21 [Batch Start Line 9]
Error converting data type varchar to numeric.
我知道問題來自內部程序中的 catch 塊,它發生是因為我試圖在引發錯誤之前將某些內容插入到我的日志表中。當我切換這些陳述句或洗掉插入時,我會收到實際的錯誤訊息。我也知道在內部程序和無論如何都回滾的事務中進行日志記錄是不明智的。
即使 XACT_ABORT 設定為關閉,我也想了解是什么使該交易成為“注定”的交易。
完整代碼:
我的主要程式:
CREATE PROCEDURE [dbo].[OuterProcedure]
AS
BEGIN
SET XACT_ABORT OFF;
BEGIN TRY
BEGIN TRANSACTION ;
-- do other stuff
EXEC [dbo].[innerprocedure];
-- do other stuff
COMMIT TRANSACTION ;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
DECLARE @ErrText NVARCHAR(2000);
SET @ErrText = ISNULL(ERROR_MESSAGE(), 'nothing')
RAISERROR(@ErrText, 11, 1) WITH NOWAIT
END CATCH;
END;
我的內部程式:
CREATE PROCEDURE [dbo].[InnerProcedure]
AS
BEGIN
SET XACT_ABORT OFF;
SET NOCOUNT ON;
BEGIN TRY
-- do other stuff
-- provoke error
SELECT
CASE
WHEN 1 = 0
THEN 0.0
ELSE ''
END;
-- do other stuff
END TRY
BEGIN CATCH
DECLARE @ErrText NVARCHAR(2000);
SELECT
@ErrText = ISNULL(ERROR_MESSAGE(), 'nothing');
INSERT INTO [dbo].[logtable]
(
[Message]
, [ErrNr]
)
VALUES
( @ErrText
, -1
);
RAISERROR(@LogText, 11, 0) WITH NOWAIT;
END CATCH;
END;
uj5u.com熱心網友回復:
即使 XACT_ABORT 設定為關閉,我也想了解是什么使該交易成為“注定”的交易。
XACT_STATE()是-1在catch塊這樣的交易注定。
SELECT
CASE
WHEN 1 = 0
THEN 0.0
ELSE ''
END;
拋出錯誤
將資料型別 varchar 轉換為數字時出錯。
“大多數轉換錯誤”是Erland Sommarskog 歸入錯誤類別的錯誤型別之一。
帶回滾的批量中止這是 SQL Server 對用戶錯誤的最強烈反應。如果堆疊上沒有 CATCH 處理程式,這些錯誤會立即中止執行,并且它們還會回滾任何打開的事務。如果有一個 CATCH 處理程式,錯誤就會被捕獲,但任何打開的事務都注定要失敗,必須回滾。無論 XACT_ABORT 是 ON 還是 OFF,行為都是相同的。
錯誤行為的分類有些晦澀、無證且不直觀。閱讀他的文章了解更多詳情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405449.html
標籤:
上一篇:有沒有一種快速的方法可以將varchar(8)二進制序列轉換為T-SQL中的整數?
下一篇:如何在多個列上搜索串列?
