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.

Любая идея о том, что является причиной этого?

Я просто следую инструкциям в этом ответе .

Эван Кэрролл
источник

Ответы:

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, вам необходимо преобразовать Amountв BIGINT.

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 Я не уверен! Я предполагаю, что вполне возможно, что распределение случайных значений было другим, и моё искажение было достаточно низким, чтобы не стать a BIGINT. Это моя лучшая догадка.
Эрик Дарлинг
@EvanCarroll Я написал dbfiddle после того, как поговорил об этом с Полом У. на более эффективном примере, только заметьте, что он не будет работать на dbfiddle из-за требований к разделению: dbfiddle.uk/…
Эрик Дарлинг,