我在sql Server中遇到了以下错误(或功能).
当我使用SUM(*列*),其中列具有数字(18,8)类型,并将其乘以任何其他数字(整数或十进制),结果精度将减少为数字(18,6).
以下是演示的示例脚本.
CREATE TABLE #temp (Qnty numeric(18,8)) INSERT INTO #temp (Qnty) VALUES (0.00000001) INSERT INTO #temp (Qnty) VALUES (0.00000002) INSERT INTO #temp (Qnty) VALUES (0.00000003) SELECT Qnty,1*Qnty FROM #temp SELECT (-1)*SUM(Qnty),SUM(Qnty),-SUM(Qnty),SUM(Qnty) * CAST(2.234 as numeric(18,8)) FROM #temp DROP TABLE #temp
第二个SELECT查询的结果
0.000000 0.00000006 -0.00000006 0.000000
正如你可以看到,我乘以SUM的结果是0.000000
有人可以解释奇怪的行为吗?
UPD.我在2000,2005和2008 sql Server的sql Management Studio中执行了这个查询.
解决方法
使用
SUM聚合数字(18,8)会导致数据类型数字(38,8).
如何在将数值乘以数字时计算出结果数据类型,可以在这里找到:Precision,Scale,and Length (Transact-SQL)
常数-1的数据类型是数字(1,0)
精度是p1 p2 1 = 40
比例为s1 s2 = 8
最大精度为38,并带有数字(38,6).
阅读更多关于为什么它是数字(38,6)在这里:Multiplication and Division with Numerics