Ако получавате грешка Съобщение 8115, ниво 16, грешка при аритметично препълване при преобразуване на израз в тип данни int в SQL Server може да се окаже, че извършвате изчисление, което води до стойност извън диапазона.
Това може да се случи когато използвате функция като SUM()
върху колона и изчислението води до стойност, която е извън диапазона на типа на колоната.
Пример за грешката
Ето пример за код, който създава грешката:
SELECT SUM(bank_balance)
FROM accounts;
Резултат:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
В този случай използвах SUM()
функция за получаване на сумата от bank_balance
колона, която има тип данни int
.
Грешката възникна, защото резултатът от изчислението е извън обхвата на int
тип данни.
Ето всички данни в моята таблица:
SELECT bank_balance
FROM accounts;
Резултат:
+----------------+ | bank_balance | |----------------| | 1300000000 | | 1200000000 | | 800500000 | +----------------+
Това са някои големи банкови салда... и добавянето на трите от тях води до по-голямо число от int
може да обработва (int
диапазонът е -2,147,483,648 до 2,147,483,647).
Решението
Можем да се справим с тази грешка, като преобразуваме int
колона към bigint
когато стартираме заявката:
SELECT SUM(CAST(bank_balance AS bigint))
FROM Accounts;
Резултат:
3300500000
Този път се получи.
Можете също да промените типа данни на действителната колона за по-трайно решение.
В случай, че се чудите, bigint
диапазонът е -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
Една и съща грешка в различни сценарии
Същата грешка (Msg 8115) може да възникне (с малко по-различно съобщение за грешка), когато се опитате да преобразувате изрично между типове данни и оригиналната стойност е извън обхвата на новия тип. Вижте коригиране на „Грешка при аритметично препълване при преобразуване int в числови тип данни“ в SQL Server, за да коригирате това.
Същата грешка (Msg 8115) може да възникне (с малко по-различно съобщение за грешка), когато се опитате да вмъкнете данни в таблица, когато нейният IDENTITY
колоната е достигнала ограничението за своя тип данни. Вижте Поправка:„Грешка при аритметично препълване при преобразуване на IDENTITY
към тип данни...” в SQL Server за това как да поправите това.