有効桁数、小数点以下桁数、長さ (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric のSQL 分析エンドポイント
Microsoft Fabric のウェアハウス
precision は、数値全体の桁数です。 scale は、数値の中で小数点より右側の桁数です。 たとえば、123.45
という数値の場合、precision は 5
、scale は 2
になります。
SQL Server では、numeric および decimal データ型の precision の既定の最大値は 38 です。
数値データ型の長さは、数値の格納に使用されるバイト数です。 varchar および char の場合、文字列の長さはバイト数です。 nvarchar および nchar の場合、文字列の長さはバイトペアの数です。 binary、varbinary、および image データ型の長さはバイト数です。 たとえば、int データ型は 10 桁を保持することができ、4 バイトに格納され、小数点は許可されません。 Int データ型の precision は 10、長さは 4、scale は 0 です。
char、varchar、binary、または varbinary 式を 2 つ連結する場合、結果として得られる式の長さは 2 つのソース式の長さの合計 (上限は 8,000 バイト) です。
nchar または nvarchar 式を 2 つ連結する場合、結果として得られる式の長さは 2 つのソース式の長さの合計 (上限は 4,000 バイトペア) です。
同じデータ型で長さが異なる 2 つの式が、
UNION
、EXCEPT
、またはINTERSECT
を使って比較される場合、結果の長さは 2 つの式のうち長い方です。
解説
decimal を除いた数値データ型の precision と scale は固定です。 同じデータ型の 2 つの式に算術演算子を使用する場合、得られる結果のデータ型は同じになり、そのデータ型に定義されている precision と scale が適用されます。 異なるデータ型の 2 つの式に演算子を使用する場合、結果のデータ型はデータ型の優先順位規則によって決まります。 結果には、そのデータ型に定義されている precision と scale が適用されます。
次の表では、演算の結果が decimal 型の場合に precision と scale がどのように計算されるかを定義しています。 次のいずれかの場合、結果は decimal です。
- 両方の式が decimal である。
- 一方の式が decimal で、もう一方が decimal よりも優先順位の低いデータ型である。
オペランド式は、precision が p1
で scale が s1
の式 e1
と、precision が p2
で scale が s2
の式 e2
で表されます。 decimal でない任意の式の precision と scale は、その式のデータ型に定義された precision と scale です。 関数 max(a, b)
は、a
または b
のうち大きい方の値を受け取ることを示します。 同様に、min(a, b)
は a
または b
のうち小さい方の値を受け取ることを示します。
操作 | 結果の precision | 結果の scale 1 |
---|---|---|
e1 + e2 | max(s1, s2) + max(p1 - s1, p2 - s2) + 1 | max(s1, s2) |
e1 - e2 | max(s1, s2) + max(p1 - s1, p2 - s2) + 1 | max(s1, s2) |
e1 * e2 | p1 + p2 + 1 | s1 + s2 |
e1 / e2 | p1 - s1 + s2 + max(6, s1 + p2 + 1) | max(6, s1 + p2 + 1) |
e1 { UNION | EXCEPT | INTERSECT } e2 | max(s1, s2) + max(p1 - s1, p2 - s2) | max(s1, s2) |
e1 % e2 | min(p1 - s1, p2 - s2) + max(s1, s2) | max(s1, s2) |
1 結果の precision と scale の絶対最大値は 38 です。 結果の precision が 38 桁を超える場合は 38 桁に減らされます。この際、結果の整数部分が切り捨てられることを防ぐために、scale が減らされます。 乗算や除算などの演算では、decimal の precision を維持するために scale が減らされることはありません。これは、オーバーフロー エラーが発生する可能性がある場合でも同じです。
加算と減算では、decimal の整数部を格納するのに max(p1 - s1, p2 - s2)
桁必要です。 それらを格納できる十分な領域がない (つまり max(p1 - s1, p2 - s2) < min(38, precision) - scale
) の場合は、整数部の領域を提供するために、scale が減らされます。 結果の scale は min(precision, 38) - max(p1 - s1, p2 - s2)
になるため、この桁数に収まるように小数部が丸められます。
乗算と除算では、結果の整数部を格納するのに precision - scale
桁必要です。 次のルールを使用して、scale が減らされることがあります。
- 整数部が 32 桁よりも少ない場合、結果の scale は
38 - (precision-scale)
を超えることはできないため、min(scale, 38 - (precision-scale))
に減らされます。 これに該当する場合、結果は丸められる可能性があります。 - scale が 6 桁未満であり、整数部が 32 を超える場合、scale が変更されることはありません。 これに該当する場合、decimal(38, scale) に収まらなければ、オーバーフロー エラーが発生することがあります
- scale が 6 桁以上であり、整数部が 32 を超える場合、scale は 6 に設定されます。 これに該当する場合、整数部の桁数と scale の両方が減らされ、結果の型は decimal(38, 6) になります。 結果は小数点以下 7 桁に丸められるか、整数部が 32 桁に収まらない場合にオーバーフロー エラーがスローされる可能性があります。
例
次の式は、丸めなしの結果 0.00000090000000000
を返します。これは、結果が decimal(38, 17) に収まるためです。
SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];
ここでは、precision は 61
であり、scale は 40
です。
整数部 (precision-scale = 21)
は 32 未満なので、このケースは乗算規則の最初のケースとなり、scale は min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17
として計算されます。 結果の型は decimal(38, 17) です。
次の式は、decimal(38, 6) に収めた結果 0.000001
を返します。
SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];
ここでは、precision は 61
であり、scale は 20
です。
scale が 6 桁を越えており、整数部 (precision-scale = 41
) が 32 を超えています。 このケースは乗算規則の 3 番目のケースであり、結果の型は decimal(38, 6) です。