2

この式は暗黙的な変換を使用します。

SELECT 9.999 * '9.999'

99.980001 と評価されます。

これを使用して型情報をログに記録すると:

SELECT
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'BaseType'),
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'Precision'),
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'Scale'),
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'MaxLength')

私は得る:

  • BaseType数値
  • プレシジョン9
  • スケール6
  • 最大長5

精度を除くすべての結果を理解していると思います。小数点以下の桁数を左2桁、右6桁とすると合計8桁になります。

ここで SQL Server が 9 を計算するのはなぜですか?

PS私はSQL Server 2008 R2を使用しています

4

1 に答える 1

3

精度、スケール、および長さから(Transact-SQL)

断面を見ると

Operation:
e1 * e2

見つけるだろう

Result precision
p1 + p2 + 1

だからあなたの場合4+4+1 => 9

それに加えて、あなたはそれに気付くでしょう

SELECT  SQL_VARIANT_PROPERTY(99.999 * '9.999', 'Precision'), --11 => p1+p1+1
        SQL_VARIANT_PROPERTY(99.999 * '99.999', 'Precision'), --11 => p1+p1+1
        SQL_VARIANT_PROPERTY(99.999 * 9.999, 'Precision'), --10 => p1+p2+1
        SQL_VARIANT_PROPERTY(99.999 * 99.999, 'Precision') -- 11 => p1+p2+1

一方

SELECT  SQL_VARIANT_PROPERTY(9.999 * '9.999', 'Precision') --9 => p1+p1+1

SELECT  SQL_VARIANT_PROPERTY(9.99 * '9.999', 'Precision')

原因

Arithmetic overflow error converting varchar to data type numeric.
于 2013-07-18T08:53:17.780 に答える