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/…
Эрик Дарлинг,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.