適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric の SQL データベース
decimal および numeric は、有効桁数と小数点以下桁数が固定された数値データ型です。 decimal と numeric はシノニムであり、同じ意味で使用できます。
Arguments
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 (スケール)
小数点の右側の保存される桁数です。 この数値が 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) 以降のバージョンでは表示されません。
Examples
A. 10 進データ型と数値データ型を使用してテーブルを作成する
次の例では、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
B. 精度と小数点以下桁数を低くして float を 10 進数に変換する
次の例は、精度と小数点以下桁数が低い 10 進数に変換された場合の float 値の丸め方を示しています。
CREATE TABLE dbo.MyTable (
MyFloatColumn FLOAT,
MyDecimalColumn DECIMAL(10, 3)
);
GO
DECLARE @value FLOAT;
SELECT @value = 12345.123456789;
INSERT INTO dbo.MyTable
VALUES (@value, @value);
GO
SELECT MyFloatColumn, MyDecimalColumn
FROM dbo.MyTable;