decimal 型と numeric 型 (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric のSQL 分析エンドポイント
Microsoft Fabric のウェアハウス
decimal および numeric は、有効桁数と小数点以下桁数が固定された数値データ型です。 decimal と numeric はシノニムであり、同じ意味で使用できます。
引数
decimal [ ( p [ , s ] ) と numeric [ ( p [ , s ] ) ]
固定長の有効桁数と小数点以下保持桁数です。 最大有効桁数を使用する場合、有効な値は -10^38 + 1
から 10^38 - 1
までです。 decimal の ISO シノニムは、dec および dec(p,s)です。 numeric は機能的には decimal と同じです。
p (有効桁数)
格納される 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 桁の有効桁数のみをサポートします。
10 進データと数値データの変換
decimal データ型と numeric データ型の場合、SQL Server では、有効桁数と小数点以下桁数の組み合わせが異なる場合は、異なるデータ型と見なされます。 たとえば、decimal(5,5) と decimal(5,0) は異なるデータ型と見なされます。
Transact-SQL ステートメントでは、小数点の付いた定数は、必要最小限の有効桁数と小数点以下桁数で自動的に numeric 型の値に変換されます。 たとえば、定数12.345
は、5
の有効桁数と3
の小数点以下桁数を使用して、数値値に変換されます。
変換 ( | への変換 | コンバージョン リスク |
---|---|---|
decimal および numeric | float または real | 精度が失われる可能性があります |
int、 smallint、 tinyint、 float、 real、 money、または smallmoney | decimal および numeric | オーバーフローの可能性 |
SQL Server では、既定で、数値を decimal 型または numeric 型の値に変換する場合、有効桁数と小数点以下桁数が少なくなって丸められます。 逆に、 SET ARITHABORT
オプションが ON
の場合、オーバーフローが発生すると SQL Server によってエラーが発生します。 有効桁数と小数点以下桁数が失われただけではエラーは生成されません。
SQL Server 2016 (13.x) より前の場合、 float 値を decimal または numeric への変換は、有効桁数 17 桁の値のみに制限されます。 float値が5E-18
未満 (5E-18
の科学的表記法または0.000000000000000005
の 10 進表記を使用して設定した場合) は、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