SET ARITHABORT (Transact-SQL)

適用於:Microsoft Fabric 中 Microsoft Fabric倉儲中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 Azure SynapseAnalytics Analytics Platform System (PDW)SQL 分析端點

查詢執行期間發生溢位或除以零錯誤時結束查詢。

Transact-SQL 語法慣例

Syntax

Azure Synapse Analytics、Microsoft Fabric 中的 SQL Server 無伺服器 SQL 集區語法

SET ARITHABORT { ON | OFF }

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的語法

SET ARITHABORT ON

注意

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

備註

在登入工作階段中一律將 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 和 SET ANSI WARNINGS 都是 OFF,且發生這其中一個錯誤,就會出現一則警告訊息,而算術運算的結果會是 NULL。

注意

如果 SET ARITHABORT 和 SET ARITHIGNORE 都不是 ON,則 SQL Server 會傳回 NULL,並在查詢執行之後,傳回一則警告訊息。

當 ANSI_WARNINGS 的值為 ON 且將資料庫相容性層級設為 90 或更高時,不論其值設定為何,ARITHABORT 都會隱含為 ON。 如果資料庫的相容性層級設定為 80 或更低,ARITHABORT 選項就必須明確地設定為 ON。

進行運算式評估時,如果 SET ARITHABORT 為 OFF,而且 INSERT、UPDATE 或 DELETE 陳述式遇到算術、溢位、除以零或網域錯誤,SQL Server 就會插入或更新 NULL 值。 如果目標資料行不可為 Null,插入或更新動作就會失敗,而使用者會看見錯誤。

當 SET ARITHABORT 或 SET ARITHIGNORE 都不是 OFF,而 SET ANSI_WARNINGS 為 ON 時,SQL Server 仍將在遇到除以零或溢位錯誤時傳回錯誤訊息。

當 SET ARITHABORT 為 OFF,且在 IF 陳述式的布林值條件評估期間發生中止錯誤時,就會執行 FALSE 分支。

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

SET ARITHABORT 的設定會在執行階段發生,而非剖析階段。

若要檢視 SET ARITHABORT 的目前設定,請執行下列查詢:

DECLARE @ARITHABORT VARCHAR(3) = 'OFF';  
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';  
SELECT @ARITHABORT AS 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)