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.