Jeśli otrzymujesz błąd Msg 8115, Level 16, Błąd przepełnienia arytmetycznego podczas konwersji typu danych na typ danych liczbowych w SQL Server jest to prawdopodobnie spowodowane wykonywaniem operacji, która powoduje błąd konwersji danych z powodu wartości spoza zakresu.
Zdarza się to często, gdy próbujesz przekonwertować liczbę na inny typ danych, ale jest to poza dopuszczalnym zakresem dla nowego typu danych.
Przykład błędu
Oto przykład kodu, który generuje błąd:
SELECT CAST(275 AS DECIMAL(3, 2));
Wynik:
Msg 8115, Level 16, State 8, Line 1 Arithmetic overflow error converting int to data type numeric.
W tym przypadku próbowałem zamienić liczbę całkowitą na ułamek dziesiętny.
Ale moim błędem jest to, że pozwoliłem tylko na precyzję 3 dla wynikowej wartości dziesiętnej. Ta precyzja nie jest wystarczająca dla wartości, która zostałaby wytworzona przez tę operację (która byłaby 275.00
).
Rozwiązanie
Problem można łatwo rozwiązać:
SELECT CAST(275 AS DECIMAL(5, 2));
Wynik:
275.00
Wszystko, co zrobiłem, to zwiększenie argumentu precyzji do bardziej wystarczającej wartości.
W szczególności zwiększyłem go z 3
do 5
.
Jeśli spodziewałem się, że przejdą większe liczby całkowite (na przykład, jeśli liczba całkowita znajdowała się w kolumnie bazy danych), musiałbym zwiększyć precyzję, aby mogła obsłużyć większe wartości.
Dla jasności, precyzja to maksymalna całkowita liczba cyfr dziesiętnych, które mają być przechowywane. Liczba ta obejmuje zarówno lewą, jak i prawą stronę przecinka dziesiętnego. Dokładność musi być wartością od 1
przez maksymalną precyzję 38
. Domyślna precyzja to 18
.
Ten sam błąd w różnych scenariuszach
Ten sam błąd (Msg 8115) może wystąpić (z nieco innym komunikatem o błędzie) podczas korzystania z funkcji takiej jak SUM()
w kolumnie, a wyniki obliczeń są wartościami spoza zakresu typu kolumny. Zobacz Napraw „Błąd przepełnienia arytmetycznego podczas konwersji wyrażenia na typ danych int” 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ć.