共用方式為


SET ARITHABORT (Transact-SQL)

查詢執行過程中發生溢位或除以零的錯誤時結束查詢。

主題連結圖示 Transact-SQL 語法慣例

語法

SET ARITHABORT { ON | OFF }
[ ; ]

備註

您應該在登入工作階段中一律將 ARITHABORT 設為 ON。將 ARITHABORT 設為 OFF 可能會對查詢最佳化造成負面影響,進而導致效能問題。

警告注意事項注意

SQL Server Management Studio 的預設 ARITHABORT 設定是 ON。將 ARITHABORT 設定為 OFF 的用戶端應用程式可能會接收不同的查詢計畫,導致難以疑難排解效能不良的查詢。也就是說,相同查詢的執行速度在 Management Studio 中可能很快,但是在應用程式中可能很慢。使用 Management Studio 來疑難排解查詢時,一定要比對用戶端 ARITHABORT 設定。

如果 SET ARITHABORT 和 SET ANSI WARNINGS 都是 ON,這些錯誤狀況會使查詢結束。

如果 SET ARITHABORT 是 ON,而 SET ANSI WARNINGS 是 OFF,這些錯誤狀況會使批次結束。如果交易發生這些錯誤,就會回復交易。如果 SET ARITHABORT 是 OFF,且發生這些錯誤,就會顯示一則警告訊息,且會將 NULL 指派給算術運算的結果。

如果 SET ARITHABORT 是 OFF 而且 SET ANSI WARNINGS 是 OFF,並且發生這些錯誤,就會顯示一則警告訊息,且會將 NULL 指派給算術運算的結果。

[!附註]

如果既未設定 SET ARITHABORT,也未設定 SET ARITHIGNORE,SQL Server 會傳回 NULL,且會在執行查詢之後,傳回警告訊息。

將 ANSI_WARNINGS 設定為 ON,會在資料庫相容性層級設定為 90 時,隱含地將 ARITHABORT 設定為 ON。若資料庫相容性層級設定為 80 (含) 以下,就必須明確地將 ARITHABORT 選項設定為 ON。

當 SET ARITHABORT 是 OFF 時,如果 INSERT、DELETE 或 UPDATE 陳述式發現算術錯誤、溢位、除以零或範圍錯誤,SQL Server 會插入或更新 NULL 值。如果目標資料行不可設為 Null,插入或更新動作就會失敗而且使用者會收到錯誤。

如果 SET ARITHABORT 或 SET ARITHIGNORE 是 OFF,而 SET ANSI_WARNINGS 是 ON,當發現除以零或溢位的錯誤時,SQL Server 會傳回錯誤訊息。

如果 SET ARITHABORT 設為 OFF,且在 IF 陳述式的 Boolean 條件的評估中發生中止錯誤,就會執行 FALSE 分支。

當您建立或變更計算資料行索引或索引檢視時,SET ARITHABORT 也必須是 ON。如果 SET ARITHABORT 是 OFF,含計算資料行索引的資料表或索引檢視之 CREATE、UPDATE、INSERT 和 DELETE 陳述式會失敗。

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

權限

需要 public 角色中的成員資格。

範例

下列範例會示範都有 SET ARITHABORT 設定的除以零和溢位錯誤。

-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
   a TINYINT, 
   b TINYINT
);
CREATE TABLE t2 (
   a TINYINT
);
GO
INSERT INTO t1 
VALUES (1, 0);
INSERT INTO t1 
VALUES (255, 1);
GO

PRINT '*** SET ARITHABORT ON';
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON;
GO

PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab 
FROM t1;
GO

PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab  
FROM t1;
GO

PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab 
FROM t1;
GO

PRINT '*** Resulting data - should be no data';
GO
SELECT * 
FROM t2;
GO

-- Truncate table t2.
TRUNCATE TABLE t2;
GO

-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO

-- This works properly.
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab  
FROM t1;
GO

-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab  
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab 
FROM t1;
GO

PRINT '*** Resulting data - should be 0 rows';
GO
SELECT * 
FROM t2;
GO

-- Drop tables t1 and t2.
DROP TABLE t1;
DROP TABLE t2;
GO

請參閱

參考

SET 陳述式 (Transact-SQL)

SET ARITHIGNORE (Transact-SQL)

SESSIONPROPERTY (Transact-SQL)