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 Я не впевнений! Я гадаю, що можливо, що розподіл випадкових значень був іншим, і мій перекошений досить низько, щоб не стати BIGINT. Хоча про мою найкращу здогадку.
Ерік Дарлінг

@EvanCarroll Я написав dbfiddle після розмови про це з Полом У. з більш ефективним прикладом, просто зауважте, що він не буде працювати на dbfiddle через вимоги до розділення: dbfiddle.uk/…
Ерік Дарлінг

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.