此表达式使用隐式转换:
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')
我明白了:
我相信除了精确度之外,我理解所有结果。 如果小数点左边的数字是2,右边是6,则总计为8。
为什么SQL Server在这里计算9?
P.S。我使用SQL Server 2008 R2
答案 0 :(得分:3)
来自Precision, Scale, and Length (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')
cuases
Arithmetic overflow error converting varchar to data type numeric.