SQL Server返回“将表达式转换为数据类型int的算术溢出错误”。


19

当我用 SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

我越来越,

Arithmetic overflow error converting expression to data type int.

知道是什么原因造成的吗?

我只是按照此答案中的说明进行操作。

Answers:


25

对于大于INT最大值(2,147,483,647)的值,您将要使用COUNT_BIG(*)。

SELECT COUNT_BIG(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

如果发生在中SUM,则需要转换AmountBIGINT

SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

2
SQL Server不会自动从int升级为bigint吗?#TIL因此,如果要求和可能是bigint,则需要将值包装在中CONVERT()。美丽。
埃文·卡罗尔

您在该问题上的示例是如何工作的,而我的那个当时没有工作?是你的答案吗?
埃文·卡罗尔

@EvanCarroll我不确定!我想这可能是随机值分布都不同了,我的偏斜足够低到不会成为BIGINT。那是我最大的猜测。
埃里克·达林

@EvanCarroll我写了一个dbfiddle与保罗W.用更高效的例子谈论它之后,只需注意它不会dbfiddle因为分区要求运行:dbfiddle.uk/...
埃里克·达林

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.