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')

我得到:

  • 基本类型数字
  • 精度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 回答