Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Correction de "Erreur de débordement arithmétique lors de la conversion de l'expression en type de données int" dans SQL Server

Si vous recevez l'erreur Msg 8115, niveau 16, Erreur de débordement arithmétique lors de la conversion de l'expression en type de données int dans SQL Server, il se peut que vous effectuiez un calcul qui aboutit à une valeur hors plage.

Cela peut arriver lorsque vous utilisez une fonction telle que SUM() sur une colonne, et le calcul donne une valeur en dehors de la plage du type de colonne.

Exemple d'erreur

Voici un exemple de code qui génère l'erreur :

SELECT SUM(bank_balance) 
FROM accounts;

Résultat :

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

Dans ce cas, j'ai utilisé le SUM() fonction pour obtenir la somme du bank_balance colonne, dont le type de données est int .

L'erreur s'est produite car le résultat du calcul est en dehors de la plage de int type de données.

Voici toutes les données de mon tableau :

SELECT bank_balance 
FROM accounts;

Résultat :

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

Ce sont de gros soldes bancaires… et en additionnant les trois, on obtient un nombre plus grand qu'un int peut gérer (le int la plage est de -2 147 483 648 à 2 147 483 647).

La solution

Nous pouvons traiter cette erreur en convertissant le int colonne à un bigint lorsque nous exécutons la requête :

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

Résultat :

3300500000

Cette fois, ça a marché.

Vous pouvez également modifier le type de données de la colonne réelle pour une solution plus permanente.

Au cas où vous vous poseriez la question, le bigint la plage est de -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807.

Même erreur dans différents scénarios

La même erreur (Msg 8115) peut également se produire (avec un message d'erreur légèrement différent) lorsque vous essayez de convertir explicitement entre les types de données et que la valeur d'origine est en dehors de la plage du nouveau type. Voir Corriger "Erreur de débordement arithmétique convertissant int en type de données numérique" dans SQL Server pour résoudre ce problème.

La même erreur (Msg 8115) peut également se produire (avec un message d'erreur légèrement différent) lorsque vous essayez d'insérer des données dans une table lorsque son IDENTITY colonne a atteint la limite de son type de données. Voir le correctif :"Erreur de débordement arithmétique lors de la conversion de IDENTITY au type de données… » dans SQL Server pour savoir comment résoudre ce problème.