SET NUMERIC_ROUNDABORT (Transact-SQL)

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

式の丸め処理で精度が低下するときに作成されるエラー レポートのレベルを指定します。

Transact-SQL 構文表記規則

構文


SET NUMERIC_ROUNDABORT { ON | OFF }

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

解説

SET NUMERIC_ROUNDABORT が ON の場合には、式の精度が低下するとエラーが生成されます。 OFF に設定すると、精度の低下によるエラー メッセージは生成されません。 結果は、結果を格納する列または変数の有効桁数に丸められます。

精度の損失は、固定精度の列または精度の低い変数に固定精度を持つ値を格納しようとしたときに発生します。

SET NUMERIC_ROUNDABORT が ON の場合、SET ARITHABORT は生成されたエラーの重大度を決定します。 次の表は、精度が低下するときにこの 2 つの設定がどのように影響するかを示しています。

設定 SET NUMERIC_ROUNDABORT ON SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON エラーが生成されます。結果セットは返されません。 エラーや警告は返されません。結果は丸められます。
SET ARITHABORT OFF 警告が返されます。式は NULL を返します。 エラーや警告は返されません。結果は丸められます。

NUMERIC_ROUNDABORT は、解析時ではなく実行時に設定されます。

計算列やインデックス付きビューのインデックスを作成または変更するときには、SET NUMERIC_ROUNDABORT を OFF に設定する必要があります。 SET NUMERIC_ROUNDABORT が ON の場合、計算列やインデックス付きビューのインデックスが設定されているテーブルに対する次の各ステートメントは失敗します。

  • CREATE
  • UPDATE
  • INSERT
  • DELETE

インデックス付きビューおよび計算列上のインデックスに必要な SET オプション設定の詳細については、「SET ステートメントの使用に関する留意事項」を参照してください。

この設定の現在の設定を表示するには、次のクエリを実行します。

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

アクセス許可

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

次の例では、小数点以下 4 桁の精度を持つ 2 つの値を示します。 それらは加算され、小数点以下 2 桁の精度の変数に格納されます。 この式は、SET NUMERIC_ROUNDABORTSET ARITHABORT の 2 つの設定の結果を示します。

-- SET NOCOUNT to ON,   
-- SET NUMERIC_ROUNDABORT to ON, and SET ARITHABORT to ON.  
SET NOCOUNT ON;  
PRINT 'SET NUMERIC_ROUNDABORT ON';  
PRINT 'SET ARITHABORT ON';  
SET NUMERIC_ROUNDABORT ON;  
SET ARITHABORT ON;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234 ;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  
  
-- SET NUMERIC_ROUNDABORT to ON and SET ARITHABORT to OFF.  
PRINT 'SET NUMERIC_ROUNDABORT ON';  
PRINT 'SET ARITHABORT OFF';  
SET NUMERIC_ROUNDABORT ON;  
SET ARITHABORT OFF;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234 ;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  
  
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to ON.  
PRINT 'SET NUMERIC_ROUNDABORT OFF';  
PRINT 'SET ARITHABORT ON';  
SET NUMERIC_ROUNDABORT OFF;  
SET ARITHABORT ON;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234 ;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  
  
-- SET NUMERIC_ROUNDABORT to OFF and SET ARITHABORT to OFF.  
PRINT 'SET NUMERIC_ROUNDABORT OFF';  
PRINT 'SET ARITHABORT OFF';  
SET NUMERIC_ROUNDABORT OFF;  
SET ARITHABORT OFF;  
GO  
DECLARE @result DECIMAL(5, 2),  
   @value_1 DECIMAL(5, 4),   
   @value_2 DECIMAL(5, 4);  
SET @value_1 = 1.1234;  
SET @value_2 = 1.1234;  
SELECT @result = @value_1 + @value_2;  
SELECT @result;  
GO  

参照

データ型 (Transact-SQL)
SET ステートメント (Transact-SQL)
SET ARITHABORT (Transact-SQL)