Jeśli otrzymujesz błąd Msg 8115, Level 16, Błąd przepełnienia arytmetycznego podczas konwersji wyrażenia na typ danych int w SQL Server może się zdarzyć, że wykonujesz obliczenia, których wynikiem jest wartość spoza zakresu.
Może się to zdarzyć gdy używasz funkcji takiej jak SUM()
na kolumnie, a obliczenia dają w wyniku wartość, która jest poza zakresem typu kolumny.
Przykład błędu
Oto przykład kodu, który generuje błąd:
SELECT SUM(bank_balance)
FROM accounts;
Wynik:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
W tym przypadku użyłem SUM()
funkcja, aby uzyskać sumę bank_balance
kolumna, która ma typ danych int
.
Wystąpił błąd, ponieważ wynik obliczenia jest poza zakresem int
typ danych.
Oto wszystkie dane w mojej tabeli:
SELECT bank_balance
FROM accounts;
Wynik:
+----------------+ | bank_balance | |----------------| | 1300000000 | | 1200000000 | | 800500000 | +----------------+
To są niektóre duże salda bankowe… a dodanie trzech z nich skutkuje większą liczbą niż int
może obsłużyć (int
zakres wynosi od -2147483648 do 2147483647).
Rozwiązanie
Możemy poradzić sobie z tym błędem, konwertując int
kolumna do bigint
kiedy uruchamiamy zapytanie:
SELECT SUM(CAST(bank_balance AS bigint))
FROM Accounts;
Wynik:
3300500000
Tym razem się udało.
Możesz także zmienić typ danych rzeczywistej kolumny, aby uzyskać bardziej trwałe rozwiązanie.
Jeśli się zastanawiasz, bigint
zakres wynosi od -9 223 372 036 854 775 808 do 9 223 372 036 854 775 807.
Ten sam błąd w różnych scenariuszach
Ten sam błąd (komunikat 8115) może również wystąpić (z nieco innym komunikatem o błędzie) podczas próby jawnej konwersji między typami danych, gdy oryginalna wartość znajduje się poza zakresem nowego typu. Zobacz Napraw „Błąd przepełnienia arytmetycznego konwersji na typ danych liczbowych” w SQL Server, aby to naprawić.
Ten sam błąd (Msg 8115) może również wystąpić (z nieco innym komunikatem o błędzie) podczas próby wstawienia danych do tabeli, gdy jej IDENTITY
kolumna osiągnęła limit typu danych. Zobacz poprawkę:„Błąd przepełnienia arytmetycznego podczas konwersji IDENTITY
do typu danych…” w SQL Server, aby dowiedzieć się, jak to naprawić.