SET ARITHABORT (Transact-SQL)
Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス
クエリ実行中にオーバーフローまたは 0 除算のエラーが発生した場合に、クエリを終了します。
構文
SQL Server、Azure Synapse Analytics のサーバーレス SQL プール、Microsoft Fabric の構文
SET ARITHABORT { ON | OFF }
Azure Synapse Analytics および Analytics Platform System (PDW) の構文
SET ARITHABORT ON
解説
ログオン セッションでは、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
。
Note
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 OFF は、Azure Synapse Analytics 専用 SQL プールではサポートされていません。
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