次の方法で共有


decimal 型と numeric 型 (Transact-SQL)

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

decimalnumeric は、固定の有効桁数と小数点以下桁数を持つ数値データ型です。 decimalnumeric はシノニムであり、同じ意味で使用できます。

引数

decimal [ ( p [ , s ] ) ] と numeric [ ( p [ , s ] ) ]

固定長の有効桁数と小数点以下保持桁数です。 最大有効桁数を使用する場合、有効な値は次の値から -10^38 + 1 取得されます 10^38 - 1。 decimal の ISO シノニムは、decdec(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は、有効桁数が 〗、小数点以下3桁数5が 1 の数値変換されます。

変換 ( への変換 コンバージョン リスク
decimal および numeric float または real 精度が失われる可能性があります
intsmallinttinyintfloat、realmoney、または smallmoney decimal および numeric オーバーフローの可能性

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

SQL Server 2016 (13.x) より前では、float 値から 10 進数または数値への変換は、有効桁数 17 桁の値のみに制限されます。 (指数表記または 10 進表記を5E-18使用して設定した場合) より5E-18小さい浮動小数点値は、次の0.000000000000000005値に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