Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Napraw „Błąd przepełnienia arytmetycznego podczas konwersji na typ danych liczbowych” w SQL Server

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ć.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. W SQL Server, jak mogę zablokować pojedynczy wiersz w sposób podobny do Oracle SELECT FOR UPDATE WAIT?

  2. Przewodnik po CTE w SQL Server

  3. Zwróć klucze podstawowe z połączonego serwera w SQL Server (przykłady T-SQL)

  4. Wykonaj dynamiczne zapytanie za pomocą go w sql

  5. Jak odpytać pole DATETIME używając tylko daty w Microsoft SQL Server?