SET SET ARITHABORT (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

SET ARITHABORT設定は、クエリ実行中にオーバーフローやゼロ除算エラーが発生した場合にクエリが停止するかどうかを決定します。

  • SET ARITHABORT ONSET ANSI_WARNINGS OFFを設定すると、算術エラーでバッチが終了します。 エラーがトランザクション内で発生した場合、トランザクションはロールバックされます。

  • SET ARITHABORTSET ANSI_WARNINGSの両方がOFFされ、算術エラーが発生した場合、警告メッセージが表示され(ONSET ARITHIGNOREない限り)、算術演算の結果がNULLされます。

Transact-SQL 構文表記規則

構文

SQL ServerのSyntax for Azure Synapse Analytics、Microsoft FabricのサーバーレスSQLプール、Microsoft FabricのSQL Databaseの構図


SET ARITHABORT { ON | OFF }

Azure Synapse Analytics および Analytics Platform System (PDW) の構文


SET ARITHABORT ON

解説

ANSI_WARNINGSON(デフォルト)の場合、ARITHABORTの設定は機能的な影響を持ちません。 算術エラーでクエリは終了しますが、バッチは中止されません(設定 XACT_ABORTOFFであれば)。

警告

SQL Server Management Studio(SSMS)のデフォルトのARITHABORT設定はONですが、アプリケーション内のクライアント接続はデフォルトでARITHABORT OFFです。 機能的な違いがなくても、ONANSI_WARNINGS間はARITHABORT設定はキャッシュキーです。 したがって、SSMSとアプリケーションはそれぞれのデフォルトを使っているため、キャッシュエントリが異なり、異なるクエリプランを持つこともあり、パフォーマンスの悪いクエリのトラブルシューティングが困難になります。 つまり、同じクエリがアプリケーション内でSSMSよりも遅くなることがあります。 Management Studioでクエリのトラブルシューティングを行う際は、必ずクライアント ARITHABORT 設定に合わせてください。

式の評価において、 SET ANSI_WARNINGSSET ARITHABORT の両方が OFF であり、 INSERTUPDATE、または DELETE 文が算術、オーバーフロー、除算、またはドメインエラーに遭遇した場合、クエリは NULL 値を挿入または更新します。 出力先の列で NULL 値が許容されない場合は、挿入または更新処理は失敗し、エラーが表示されます。

SET ARITHABORTの設定は実行時または実行時に行われ、構文解析時ではありません。

SET ARITHABORT OFFAzure Synapse Analytics専用SQLプールではサポートされていません。

アクセス許可

ロール public のメンバーシップが必要です。

現在の設定を見る ARITHABORT

SET ARITHABORTの現在の設定を見るには、以下のT-SQLクエリを実行してください:

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

以下の例は、異なる SET ARITHABORT 設定でのゼロ除算誤差とオーバーフロー誤差を示しています。

  1. スクリプトはサンプルテーブルを t1t2 を作成し、サンプルデータの値を挿入します。
  2. ANSI_WARNINGS ONを設定し、ゼロ除算誤差や算術オーバーフローのデフォルトの挙動を確認するテストを実行してください。
  3. ANSI_WARNINGS OFFに効果があるように設定し、ARITHABORTARITHABORT ONに設定します。 ゼロ割り算誤差と算術オーバーフローの挙動を確認するテストを実行してください。
  4. ANSI_WARNINGS OFFARITHABORT OFFの両方をセットしてください。 ゼロ割り算誤差と算術オーバーフローの挙動を確認するテストを実行してください。
  5. サンプル表を片付けてください。
-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT NOT NULL  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  

-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';  
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF;    -- To make sure that we have the default setting for this option.  
GO
PRINT '*** Testing divide-by-zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

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

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';  
GO  
SET ANSI_WARNINGS OFF; 
SET ARITHABORT ON;  
GO  

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

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This does not print.';
GO  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This does not print.';
GO  

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

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  

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

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
-- Fails with NOT NULL violation.
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
-- Fails with NOT NULL violation
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 and restore ANSI_WARNINGS
DROP TABLE t1;  
DROP TABLE t2;  
SET ANSI_WARNINGS ON
GO