sql >> Databasteknik >  >> RDS >> Sqlserver

Fixa "Arithmetic overflow-fel vid konvertering av int till datatyp numeric" i SQL Server

Om du får felmeddelandet Msg 8115, Level 16, Aritmetic overflow error konvertering int till datatyp numeric i SQL Server beror det förmodligen på att du utför en operation som resulterar i ett datakonverteringsfel på grund av ett värde utanför intervallet.

Detta händer ofta när du försöker konvertera ett tal till en annan datatyp, men det ligger utanför det accepterade intervallet för den nya datatypen.

Exempel på felet

Här är ett exempel på kod som ger felet:

SELECT CAST(275 AS DECIMAL(3, 2));

Resultat:

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

I det här fallet försökte jag konvertera ett heltal till en decimal.

Men mitt misstag är att jag bara tillät en precision på 3 för det resulterande decimalvärdet. Denna precision är inte tillräcklig för värdet som skulle produceras av denna operation (som skulle vara 275.00 ).

Lösningen

Problemet löses enkelt:

SELECT CAST(275 AS DECIMAL(5, 2));

Resultat:

275.00

Allt jag gjorde var att öka precisionsargumentet till ett mer tillräckligt värde.

Specifikt ökade jag den från 3 till 5 .

Om jag förväntade mig att större heltal skulle komma igenom (till exempel om heltalet fanns i en databaskolumn), skulle jag behöva öka precisionen så att den kunde hantera de större värdena.

Bara för att vara tydlig är precision det maximala totala antalet decimalsiffror som ska lagras. Detta nummer inkluderar både vänster och höger sida av decimalkomma. Precisionen måste vara ett värde från 1 genom maximal precision på 38 . Standardprecisionen är 18 .

Samma fel i olika scenarier

Samma fel (Msg 8115) kan uppstå (med ett något annorlunda felmeddelande) 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. Se Fixa "Arithmetic overflow-fel vid konvertering av uttryck till datatyp int" i SQL Server för att åtgärda detta.

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


  1. 32-bitars Excel och 64-bitars SQL Server

  2. 2 sätt att skapa en databas på en länkad server med T-SQL

  3. Byt namn på en användardefinierad datatyp i SQL Server (T-SQL)

  4. Är INSERT RETURNING garanterat att returnera saker i rätt ordning?