SET ARITHABORT (Transact-SQL)
適用於:Microsoft Fabric Microsoft網狀架構倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) SQL 分析端點
查詢執行期間發生溢位或除以零錯誤時結束查詢。
Syntax
Azure Synapse Analytics 中的 SQL Server 無伺服器 SQL 集區語法,Microsoft Fabric
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 的設定會在執行階段發生,而非剖析階段。
Azure Synapse Analytics 專用 SQL 集區不支援 SET ARITHABORT OFF。
若要檢視 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