適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
SET ARITHABORT設定は、クエリ実行中にオーバーフローやゼロ除算エラーが発生した場合にクエリが停止するかどうかを決定します。
SET ARITHABORT ONとSET ANSI_WARNINGS OFFを設定すると、算術エラーでバッチが終了します。 エラーがトランザクション内で発生した場合、トランザクションはロールバックされます。SET ARITHABORTとSET ANSI_WARNINGSの両方がOFFされ、算術エラーが発生した場合、警告メッセージが表示され(ONがSET ARITHIGNOREない限り)、算術演算の結果がNULLされます。
構文
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_WARNINGSがON(デフォルト)の場合、ARITHABORTの設定は機能的な影響を持ちません。 算術エラーでクエリは終了しますが、バッチは中止されません(設定 XACT_ABORT が OFFであれば)。
警告
SQL Server Management Studio(SSMS)のデフォルトのARITHABORT設定はONですが、アプリケーション内のクライアント接続はデフォルトでARITHABORT OFFです。 機能的な違いがなくても、ONANSI_WARNINGS間はARITHABORT設定はキャッシュキーです。 したがって、SSMSとアプリケーションはそれぞれのデフォルトを使っているため、キャッシュエントリが異なり、異なるクエリプランを持つこともあり、パフォーマンスの悪いクエリのトラブルシューティングが困難になります。 つまり、同じクエリがアプリケーション内でSSMSよりも遅くなることがあります。 Management Studioでクエリのトラブルシューティングを行う際は、必ずクライアント ARITHABORT 設定に合わせてください。
式の評価において、 SET ANSI_WARNINGS と SET ARITHABORT の両方が OFF であり、 INSERT、 UPDATE、または 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 設定でのゼロ除算誤差とオーバーフロー誤差を示しています。
- スクリプトはサンプルテーブルを
t1・t2を作成し、サンプルデータの値を挿入します。 -
ANSI_WARNINGS ONを設定し、ゼロ除算誤差や算術オーバーフローのデフォルトの挙動を確認するテストを実行してください。 -
ANSI_WARNINGS OFFに効果があるように設定し、ARITHABORTARITHABORT ONに設定します。 ゼロ割り算誤差と算術オーバーフローの挙動を確認するテストを実行してください。 -
ANSI_WARNINGS OFFとARITHABORT OFFの両方をセットしてください。 ゼロ割り算誤差と算術オーバーフローの挙動を確認するテストを実行してください。 - サンプル表を片付けてください。
-- 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