SET ARITHABORT (Transact-SQL)SET ARITHABORT (Transact-SQL)

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance はいAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics はいParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

クエリ実行中にオーバーフローまたは 0 除算のエラーが発生した場合に、クエリを終了します。Ends a query when an overflow or divide-by-zero error occurs during query execution.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

SQL ServerSQL Server および Azure Synapse Analytics のサーバーレス SQL プールserverless SQL pool in Azure Synapse Analytics の構文Syntax for SQL ServerSQL Server and Azure Synapse Analytics のサーバーレス SQL プールserverless SQL pool in Azure Synapse Analytics

SET ARITHABORT { ON | OFF }

Azure Synapse AnalyticsAzure Synapse Analytics および Parallel Data WarehouseParallel Data Warehouse の構文Syntax for Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse

SET ARITHABORT ON

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

解説Remarks

ログオン セッションでは、ARITHABORT を常に ON に設定します。Always set ARITHABORT to ON in your logon sessions. ARITHABORT を OFF に設定すると、クエリ最適化に悪影響を与え、パフォーマンスに関する問題が発生する可能性があります。Setting ARITHABORT to OFF can negatively impact query optimization, leading to performance issues.

警告

SQL Server Management StudioSQL Server Management Studio の ARITHABORT の既定値は ON です。The default ARITHABORT setting for SQL Server Management StudioSQL Server Management Studio is ON. ARITHABORT が OFF に設定されているクライアント アプリケーションは異なるクエリ プランを受け取り、パフォーマンスに問題のあるクエリのトラブルシューティングが困難になる場合があります。Client applications setting ARITHABORT to OFF might receive different query plans, making it difficult to troubleshoot poorly performing queries. つまり、同じクエリでも Management Studio 内では高速実行できますが、アプリケーション内では実行速度が低下する可能性があります。That is, the same query might execute fast in management studio but slow in the application. トラブルシューティングを行うとき、Management StudioManagement Studio を使用するクエリは常に、クライアントの ARITHABORT 設定と一致します。When troubleshooting queries with Management StudioManagement Studio, always match the client ARITHABORT setting.

SET ARITHABORT と SET ANSI WARNINGS が ON の場合、これらのエラー状態が発生するとクエリが終了します。When SET ARITHABORT and SET ANSI WARNINGS are ON, these error conditions cause the query to end.

SET ARITHABORT が ON で SET ANSI WARNINGS が OFF の場合、これらのエラー状態が発生するとバッチが終了します。When SET ARITHABORT is ON and SET ANSI WARNINGS is OFF, these error conditions cause the batch to end. エラーがトランザクション内で発生した場合、トランザクションはロールバックされます。If the errors occur in a transaction, the transaction is rolled back. SET ARITHABORT が OFF の場合に、これらのいずれかのエラーが発生すると、警告メッセージが表示され、算術演算の結果が NULL になります。When SET ARITHABORT is OFF and one of these errors occurs, a warning message appears and the result of the arithmetic operation is NULL.

SET ARITHABORT と SET ANSI WARNINGS が OFF の場合に、これらのいずれかのエラーが発生すると、警告メッセージが表示され、算術演算の結果が NULL になります。If SET ARITHABORT and SET ANSI WARNINGS are OFF and one of these errors occurs, a warning message appears, and the result of the arithmetic operation is NULL.

注意

SET ARITHABORT と SET ARITHIGNORE の両方とも ON でない場合、SQL ServerSQL Server では NULL が返され、クエリの実行後に警告メッセージが表示されます。If neither SET ARITHABORT nor SET ARITHIGNORE is ON, SQL ServerSQL Server returns NULL and a warning message appears after the query runs.

ANSI_WARNINGS の値が ON で、データベース互換性レベルが 90 以上に設定されている場合、ARITHABORT は値の設定に関係なく暗黙的に ON になります。When ANSI_WARNINGS has a value of ON and the database compatibility level is set to 90 or higher then ARITHABORT is implicitly ON regardless of its value setting. データベース互換性レベルが 80 以下に設定されている場合は、ARITHABORT オプションを明示的に ON に設定する必要があります。If the database compatibility level is set to 80 or earlier, the ARITHABORT option must be explicitly set to ON.

式の評価では、SET ARITHABORT が OFF の場合に、INSERT、UPDATE、または DELETE ステートメントで算術演算エラー、オーバーフロー エラー、0 除算エラー、またはドメイン エラーが検出されると、SQL ServerSQL Server では NULL 値が挿入または更新されます。For expression evaluation, if SET ARITHABORT is OFF and an INSERT, UPDATE, or DELETE statement comes across an arithmetic, overflow, divide-by-zero, or domain error, SQL ServerSQL Server inserts or updates a NULL value. 出力先の列で NULL 値が許容されない場合は、挿入または更新処理は失敗し、エラーが表示されます。If the target column isn't nullable, the insert or update action fails and the user sees an error.

SET ARITHABORT と SET ARITHIGNORE のいずれかが OFF でも、SET ANSI_WARNINGS が ON の場合は、SQL ServerSQL Server で 0 除算やオーバーフロー エラーが検出されるとエラー メッセージが返されます。When either SET ARITHABORT or SET ARITHIGNORE is OFF and SET ANSI_WARNINGS is ON, SQL ServerSQL Server still returns an error message when encountering divide-by-zero or overflow errors.

SET ARITHABORT が OFF で、IF ステートメントのブール条件の評価中に中止エラーが発生すると、FALSE の分岐が実行されます。When SET ARITHABORT is OFF and an abort error occurs during the evaluation of the Boolean condition of an IF statement, the FALSE branch executes.

計算列やインデックス付きビューのインデックスを作成または変更するときには、SET ARITHABORT を ON に設定する必要があります。SET ARITHABORT must be ON when you're creating or changing indexes on computed columns or indexed views. SET ARITHABORT が OFF の場合、計算列にインデックスが設定されているテーブルやインデックス付きビューに対して CREATE、UPDATE、INSERT、または DELETE ステートメントを実行すると失敗します。If SET ARITHABORT is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views fail.

SET ARITHABORT は、解析時ではなく実行時に設定されます。The setting of SET ARITHABORT happens at execute or run time and not at parse time.

SET ARITHABORT の現在の設定を表示するには、次のクエリを実行します。To view the current setting for SET ARITHABORT, run the following query:

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

アクセス許可Permissions

ロール public のメンバーシップが必要です。Requires membership in the public role.

Examples

次の例では、SET ARITHABORT を ON に設定した場合の 0 除算のエラーおよびオーバーフロー エラーをそれぞれ示しています。The following example demonstrates the divide-by-zero and overflow errors that have SET ARITHABORT settings.

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

参照See Also

SET ステートメント (Transact-SQL) SET Statements (Transact-SQL)
SET ARITHIGNORE (Transact-SQL) SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)SESSIONPROPERTY (Transact-SQL)