Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Correzione di "Errore di overflow aritmetico durante la conversione dell'espressione in tipo di dati int" in SQL Server

Se ricevi un errore Msg 8115, livello 16, errore di overflow aritmetico durante la conversione dell'espressione nel tipo di dati int in SQL Server, è possibile che tu stia eseguendo un calcolo che risulta in un valore fuori intervallo.

Questo può accadere quando usi una funzione come SUM() su una colonna e il calcolo restituisce un valore che non rientra nell'intervallo del tipo di colonna.

Esempio di errore

Ecco un esempio di codice che produce l'errore:

SELECT SUM(bank_balance) 
FROM accounts;

Risultato:

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

In questo caso ho usato il SUM() funzione per ottenere la somma del bank_balance colonna, che ha un tipo di dati int .

L'errore si è verificato perché il risultato del calcolo non rientra nell'intervallo di int tipo di dati.

Ecco tutti i dati nella mia tabella:

SELECT bank_balance 
FROM accounts;

Risultato:

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

Questi sono dei grossi saldi bancari... e sommando i tre si ottiene un numero maggiore di un int può gestire (il int l'intervallo è compreso tra -2.147.483.648 e 2.147.483.647).

La soluzione

Possiamo gestire questo errore convertendo int colonna a un bigint quando eseguiamo la query:

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

Risultato:

3300500000

Questa volta ha funzionato.

Puoi anche modificare il tipo di dati della colonna effettiva per una soluzione più permanente.

Nel caso ve lo stiate chiedendo, il bigint l'intervallo è compreso tra -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807.

Stesso errore in diversi scenari

Lo stesso errore (Msg 8115) può verificarsi anche (con un messaggio di errore leggermente diverso) quando si tenta di convertire in modo esplicito tra tipi di dati e il valore originale non rientra nell'intervallo del nuovo tipo. Vedi Correzione "Errore di overflow aritmetico durante la conversione int in tipo di dati numerico" in SQL Server per risolvere questo problema.

Lo stesso errore (Msg 8115) può verificarsi anche (con un messaggio di errore leggermente diverso) quando si tenta di inserire dati in una tabella quando il suo IDENTITY colonna ha raggiunto il limite del tipo di dati. Vedi Correzione:"Errore di overflow aritmetico durante la conversione di IDENTITY al tipo di dati…” in SQL Server per come risolvere il problema.