Om du får felmeddelandet Msg 8115, Level 16, Aritmetic overflow-fel vid konvertering av uttryck till datatyp int i SQL Server kan det vara så att du utför en beräkning som resulterar i ett värde utanför intervallet.
Detta kan hända när du använder en funktion som SUM()
på en kolumn, och beräkningen resulterar i ett värde som ligger utanför intervallet för kolumntypen.
Exempel på felet
Här är ett exempel på kod som ger felet:
SELECT SUM(bank_balance)
FROM accounts;
Resultat:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
I det här fallet använde jag SUM()
funktion för att få summan av bank_balance
kolumn, som har datatypen int
.
Felet uppstod eftersom resultatet av beräkningen ligger utanför intervallet för int
datatyp.
Här är all information i min tabell:
SELECT bank_balance
FROM accounts;
Resultat:
+----------------+ | bank_balance | |----------------| | 1300000000 | | 1200000000 | | 800500000 | +----------------+
Det är några stora banktillgodohavanden... och att lägga till de tre resulterar i ett större antal än en int
kan hantera (int
intervallet är -2 147 483 648 till 2 147 483 647).
Lösningen
Vi kan hantera detta fel genom att konvertera int
kolumn till en bigint
när vi kör frågan:
SELECT SUM(CAST(bank_balance AS bigint))
FROM Accounts;
Resultat:
3300500000
Den här gången fungerade det.
Du kan också ändra datatypen för den faktiska kolumnen för en mer permanent lösning.
Om du undrar, bigint
intervallet är -9 223 372 036 854 775 808 till 9 223 372 036 854 775 807.
Samma fel i olika scenarier
Samma fel (Msg 8115) kan också uppstå (med ett lite annorlunda felmeddelande) när du försöker explicit konvertera mellan datatyper och det ursprungliga värdet ligger utanför intervallet för den nya typen. Se Åtgärda "Arithmetic overflow-fel vid konvertering av int till datatyp numeric" i SQL Server för att åtgärda detta.
Samma fel (Msg 8115) kan också uppstå (med ett något annorlunda felmeddelande) när du försöker infoga data i en tabell när dess IDENTITY
kolumnen har nått sin datatyps gräns. Se Fix:"Aritmetiskt spillfel vid konvertering av IDENTITY
till datatyp...” i SQL Server för att åtgärda detta.