sql >> Databáze >  >> RDS >> Sqlserver

Oprava „Aritmetická chyba přetečení při převodu výrazu na datový typ int“ v SQL Server

Pokud se zobrazuje chyba Msg 8115, Level 16, Aritmetic overflow error převod výrazu na datový typ int na serveru SQL Server se může stát, že provádíte výpočet, jehož výsledkem je hodnota mimo rozsah.

K tomu může dojít při použití funkce jako SUM() na sloupec a výsledkem výpočtu je hodnota, která je mimo rozsah typu sloupce.

Příklad chyby

Zde je příklad kódu, který způsobuje chybu:

SELECT SUM(bank_balance) 
FROM accounts;

Výsledek:

Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.

V tomto případě jsem použil SUM() funkce k získání součtu bank_balance sloupec, který má datový typ int .

K chybě došlo, protože výsledek výpočtu je mimo rozsah int datový typ.

Zde jsou všechna data v mé tabulce:

SELECT bank_balance 
FROM accounts;

Výsledek:

+----------------+
| bank_balance   |
|----------------|
| 1300000000     |
| 1200000000     |
| 800500000      |
+----------------+

To jsou některé velké bankovní zůstatky... a sečtením tří z nich vznikne větší číslo než int zvládne (int rozsah je -2 147 483 648 až 2 147 483 647).

Řešení

S touto chybou se můžeme vypořádat převodem int sloupec na bigint když spustíme dotaz:

SELECT SUM(CAST(bank_balance AS bigint)) 
FROM Accounts;

Výsledek:

3300500000

Tentokrát to fungovalo.

Můžete také změnit typ dat skutečného sloupce pro trvalejší řešení.

V případě, že vás to zajímá, bigint rozsah je -9,223,372,036,854,775,808 až 9,223,372,036,854,775,807.

Stejná chyba v různých scénářích

Ke stejné chybě (Msg 8115) může dojít také (s mírně odlišnou chybovou zprávou), když se pokusíte explicitně převést mezi datovými typy a původní hodnota je mimo rozsah nového typu. Oprava tohoto problému naleznete v části Oprava „Aritmetická chyba přetečení při převodu int na datový typ numeric“ na serveru SQL.

Ke stejné chybě (Msg 8115) může také dojít (s mírně odlišnou chybovou zprávou), když se pokusíte vložit data do tabulky, když je IDENTITY sloupec dosáhl limitu svého datového typu. Viz Oprava:„Aritmetická chyba přetečení při převodu IDENTITY na datový typ…” v SQL Server, kde najdete, jak to opravit.


  1. Skupiny dostupnosti SQL Server AlwaysOn:Instalace a konfigurace. Část 2

  2. Jak zacházet s výjimkami PDO

  3. Změny datového konektoru v roce 2020

  4. ClusterControl - Pokročilá správa zálohování - PostgreSQL