Pokud se zobrazuje chyba Msg 8115, Level 16, Aritmetic overflow error převod int na datový typ numeric v SQL Server je to pravděpodobně proto, že provádíte operaci, která vede k chybě převodu dat kvůli hodnotě mimo rozsah.
To se často stane, když se pokusíte převést číslo na jiný datový typ, ale je to mimo povolený rozsah pro nový datový typ.
Příklad chyby
Zde je příklad kódu, který způsobuje chybu:
SELECT CAST(275 AS DECIMAL(3, 2));
Výsledek:
Msg 8115, Level 16, State 8, Line 1 Arithmetic overflow error converting int to data type numeric.
V tomto případě jsem se snažil převést celé číslo na desítkové.
Ale moje chyba je, že jsem povolil pouze přesnost 3 pro výslednou desetinnou hodnotu. Tato přesnost není dostatečná pro hodnotu, kterou by tato operace vytvořila (což by bylo 275.00
).
Řešení
Problém je snadno vyřešen:
SELECT CAST(275 AS DECIMAL(5, 2));
Výsledek:
275.00
Jediné, co jsem udělal, bylo zvýšení argumentu přesnosti na dostatečnější hodnotu.
Konkrétně jsem ji zvýšil z 3
až 5
.
Pokud bych očekával, že projdou větší celá čísla (například pokud bylo celé číslo ve sloupci databáze), musel bych zvýšit přesnost, aby mohl zpracovat větší hodnoty.
Jen pro upřesnění, přesnost je maximální celkový počet desetinných číslic, které mají být uloženy. Toto číslo zahrnuje levou i pravou stranu desetinné čárky. Přesnost musí být hodnota od 1
s maximální přesností 38
. Výchozí přesnost je 18
.
Stejná chyba v různých scénářích
Ke stejné chybě (Msg 8115) může dojít (s mírně odlišnou chybovou zprávou), když použijete funkci jako SUM()
na sloupec a výsledkem výpočtu je hodnota, která je mimo rozsah typu sloupce. Chcete-li to vyřešit, viz Oprava „Aritmetická chyba přetečení při převodu výrazu na datový typ int“ v SQL Server.
A stejná chyba (Msg 8115) může také nastat (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.