14

我在 SQL Server 中遇到了以下错误(或功能)。

当我使用SUM (*column*)wherecolumn有一个numeric(18, 8)类型并将其乘以任何其他数字(整数或小数)时,结果精度会降低到numeric(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 中执行了这个查询。

4

3 回答 3

8

numeric(18, 8)SUM聚合 a 会产生数据类型numeric(38, 8)

可以在此处找到将某些内容与数字相乘时如何计算结果数据类型:精度、比例和长度 (Transact-SQL)

常量 -1 的数据类型是numeric(1, 0)

精度p1 + p2 + 1= 40
比例s1 + s2= 8

最大精度为 38,剩下的就是numeric(38, 6).

阅读更多关于为什么在numeric(38, 6)这里:乘法和除法与数字

于 2013-01-14T07:42:43.763 回答
2

如果您阅读SUM 的参考页,您会看到在十进制列上它会产生一种NUMERIC(38,6). 您需要将 to 的结果SUM转换NUMERIC(18,8)为您想要的工作方式。

按照您的预期执行SELECT CAST(SUM(Qnty) as numeric(18,8)) * 2.234 FROM #temp收益率。0.00000013404

于 2013-01-14T07:53:04.603 回答
0

技术解释可以在http://social.msdn.microsoft.com/Forums/en/transactsql/thread/233f7380-3f19-4836-b224-9f665b852406找到

于 2013-01-14T07:34:30.580 回答