decimal 型と numeric 型 (Transact-SQL)

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

固定長の有効桁数と小数点以下保持桁数を持つ数値データ型です。 decimal と numeric は同義であり、どちらを使ってもかまいません。

引数

decimal[ (p[ ,s] ) ] and numeric[ (p[ ,s] ) ]
固定長の有効桁数と小数点以下保持桁数です。 最大有効桁数を使用した場合、有効値は - 10^38 +1 から 10^38 - 1 です。 decimal の ISO のシノニムは、dec および dec(p, s) です。 numeric は機能的には decimal と同じです。

p (precision)
格納される 10 進数の桁数の最大合計数。 この数には、小数点の左側と右側の両方が含まれます。 有効桁数の値は、1 - 38 (最大有効桁数) にする必要があります。 既定の有効桁数は 18 です。

Note

Informatica では、有効桁数と小数点以下桁数の指定に関係なく、16 の有効桁数のみサポートされます。

s (scale)
小数点の右側の保存される桁数です。 この数値が p から差し引かれ、小数点の左側の最大桁数が判別されます。 小数点以下桁数は、0 から p の範囲の値である必要があり、有効桁数が指定されている場合にのみ指定できます。 既定の小数点以下桁数は 0 です。したがって、0 <= s<= p です。 ストレージの最大サイズは有効桁数によって異なります。

Precision ストレージのバイト数
1 - 9 5
10 から 19 9
20 から 28 13
29 から 38 17

Note

Informatica (SQL Server PDW Informatica コネクタをによって接続されます) は、有効桁数と小数点以下桁数の指定に関係なく、16 桁の有効桁数のみをサポートします。

decimal 型データと numeric 型データの変換

decimal データ型と numeric データ型の場合、SQL Server では、有効桁数と小数点以下桁数の組み合わせが異なる場合は、異なるデータ型と見なされます。 たとえば、decimal(5,5)decimal(5,0) は異なるデータ型と見なされます。

Transact-SQL ステートメントでは、小数点の付いた定数は、必要最小限の有効桁数と小数点以下桁数で自動的に numeric 型の値に変換されます。 たとえば、定数 12.345 は有効桁数が 5、小数点以下桁数が 3 の numeric 型に変換されます。

decimal または numeric から float または real への変換では、ある程度の有効桁数の損失が発生することがあります。 intsmallinttinyintfloatrealmoney、または smallmoney から decimal または numeric への変換では、オーバーフローが発生することがあります。

SQL Server では、既定で、数値を decimal 型または numeric 型の値に変換する場合、有効桁数と小数点以下桁数が少なくなって丸められます。 反対に、SET ARITHABORT オプションが ON に設定されている場合は、オーバーフローが起こると SQL Server ではエラーが発生します。 有効桁数と小数点以下桁数が失われただけではエラーは生成されません。

SQL Server 2016 (13.x) より前では、float 値から decimal または numeric への変換は、有効桁数 17 桁までの値に制限されます。 5E-18 未満の float 値はすべて (5E-18 の科学的記数法または 0.0000000000000000050000000000000005 の小数点表記のいずれかを使用して設定されている場合) 0 に丸められます。 これは SQL Server 2016 (13.x) の時点で制限がなくなりました。

次の例では、decimal および numeric データ型を使用してテーブルを作成します。 各列に値が挿入されます。 結果は、SELECT ステートメントを使用して返されます。

CREATE TABLE dbo.MyTable  
(  
  MyDecimalColumn DECIMAL(5,2)  
,MyNumericColumn NUMERIC(10,5)
  
);  
  
GO  
INSERT INTO dbo.MyTable VALUES (123, 12345.12);  
GO  
SELECT MyDecimalColumn, MyNumericColumn  
FROM dbo.MyTable;  
  

結果セットは次のようになります。

MyDecimalColumn                         MyNumericColumn  
--------------------------------------- ---------------------------------------  
123.00                                  12345.12000  
  
(1 row(s) affected)  
  

関連項目

ALTER TABLE (Transact-SQL)
CAST および CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)