SET ARITHABORT (Transact-SQL)

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

クエリ実行中にオーバーフローまたは 0 除算のエラーが発生した場合に、クエリを終了します。

Transact-SQL 構文表記規則

構文

SQL Server、Azure Synapse Analytics のサーバーレス SQL プール、Microsoft Fabric の構文

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Note

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 ステートメントで算術演算、オーバーフロー、0 除算、またはドメインの各エラーが検出されると、SQL Server では NULL 値が挿入または更新されます。 出力先の列で NULL 値が許容されない場合は、挿入または更新処理は失敗し、エラーが表示されます。

SET ARITHABORT と SET ARITHIGNORE のいずれかが OFF でも、SET ANSI_WARNINGS が ON の場合は、SQL Server で 0 除算やオーバーフローのエラーが検出されるとエラー メッセージが返されます。

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 を ON に設定した場合の 0 除算のエラーおよびオーバーフロー エラーをそれぞれ示しています。

-- 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)