SET XACT_ABORT (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

注意

THROW 陳述式接受 SET XACT_ABORTRAISERROR 則不接受。 新的應用程式應該使用 THROW,而非 RAISERROR

指定當 SQL Server 陳述式產生執行階段錯誤時,Transact-SQL 是否自動回復目前的交易。

Transact-SQL 語法慣例

Syntax

SET XACT_ABORT { ON | OFF }

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

備註

當 SET XACT_ABORT 是 ON 時,如果 Transact-SQL 陳述式產生執行階段錯誤,就會終止和回復整個交易。

當 SET XACT_ABORT 是 OFF 時,在某些情況下,只會回復產生錯誤的 Transact-SQL 陳述式,交易會繼續進行。 隨著錯誤嚴重性而不同,即使 SET XACT_ABORT 是 OFF,也有可能回復整個交易。 OFF 是 T-SQL 陳述式中的預設設定,而 ON 是觸發程式中的預設設定。

SET XACT_ABORT 不會影響到如語法錯誤之類的編譯錯誤。

針對大部分 OLE DB 提供者 (包括 SQL Server) 的隱含或明確的交易,其中之資料修改陳述式的 XACT_ABORT 都必須設為 ON。 只有在提供者支援巢狀交易時,才不需要這個選項。

當 ANSI_WARNINGS=OFF 時,權限違規會造成交易中止。

SET XACT_ABORT 的設定是在執行階段進行設定,而不是在剖析階段進行設定。

若要檢視此設定的目前設定,請執行下列查詢。

DECLARE @XACT_ABORT VARCHAR(3) = 'OFF';
IF ( (16384 & @@OPTIONS) = 16384 ) SET @XACT_ABORT = 'ON';
SELECT @XACT_ABORT AS XACT_ABORT;

範例

下列程式碼範例會使有其他 Transact-SQL 陳述式的交易發生外部索引鍵違規錯誤。 在第一組陳述式中,會產生錯誤,但其他陳述式仍能順利執行,且會順利確認交易。 在第二組陳述式中,SET XACT_ABORT 設為 ON。 這會使陳述式錯誤終止批次,且會回復交易。

IF OBJECT_ID(N't2', N'U') IS NOT NULL
    DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
    DROP TABLE t1;
GO  
CREATE TABLE t1
    (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
    (a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.
INSERT INTO t2 VALUES (6);
COMMIT TRANSACTION;
GO
-- SELECT shows only keys 1 and 3 added.
-- Key 2 insert failed and was rolled back, but
-- XACT_ABORT was OFF and rest of transaction
-- succeeded.
-- Key 5 insert error with XACT_ABORT ON caused
-- all of the second transaction to roll back.
SELECT *
 FROM t2;
GO

另請參閱