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

5 façons de corriger l'erreur "Diviser par zéro" dans SQL Server (Msg 8134)

Voici cinq options pour traiter l'erreur Msg 8134 « Erreur de division par zéro rencontrée » dans SQL Server.

L'erreur

Tout d'abord, voici un exemple de code qui produit l'erreur dont nous parlons :

SELECT 1 / 0;

Résultat :

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

Nous obtenons l'erreur parce que nous essayons de diviser un nombre par zéro. Mathématiquement, cela n'a aucun sens. Vous ne pouvez pas diviser un nombre par zéro et vous attendre à un résultat significatif.

Pour traiter cette erreur, nous devons décider ce qui doit être renvoyé lorsque nous essayons de diviser par zéro. Par exemple, nous pourrions souhaiter qu'une valeur nulle soit renvoyée. Ou nous pourrions vouloir que zéro soit retourné. Ou une autre valeur.

Vous trouverez ci-dessous quelques options pour traiter cette erreur.

Option 1 :Le NULLIF() Expression

Un moyen simple et rapide de gérer cette erreur consiste à utiliser le NULLIF() expression :

SELECT 1 / NULLIF( 0, 0 );

Résultat :

NULL

NULLIF() renvoie NULL si les deux expressions spécifiées ont la même valeur. Elle renvoie la première expression si les deux expressions sont différentes. Par conséquent, si nous utilisons zéro comme deuxième expression, nous obtiendrons une valeur nulle chaque fois que la première expression est zéro. Diviser un nombre par NULL donne NULL .

En fait, SQL Server renvoie déjà NULL sur une erreur de division par zéro, mais dans la plupart des cas, nous ne le voyons pas, à cause de notre ARITHABORT et ANSI_WARNINGS paramètres (plus à ce sujet plus tard).

Option 2 :Ajoutez le ISNULL() Fonction

Dans certains cas, vous préférerez peut-être renvoyer une valeur autre que NULL .

Dans de tels cas, vous pouvez passer l'exemple précédent au ISNULL() fonction :

SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);

Résultat :

0

Ici, j'ai spécifié que zéro doit être renvoyé chaque fois que le résultat est NULL .

Soyez prudent cependant. Dans certains cas, renvoyer zéro peut être inapproprié. Par exemple, si vous avez affaire à des stocks de fournitures, spécifier zéro peut impliquer qu'il n'y a aucun produit, ce qui n'est peut-être pas le cas.

Option 3 :Utiliser un CASE Déclaration

Une autre façon de le faire est d'utiliser un CASE déclaration :

DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;

SELECT CASE
    WHEN @n2 = 0
    THEN NULL
    ELSE @n1 / @n2
END

Résultat :

NULL

Option 4 :Le SET ARITHABORT Déclaration

Le SET ARITHABORT L'instruction termine une requête lorsqu'un débordement ou une erreur de division par zéro se produit pendant l'exécution de la requête. Nous pouvons l'utiliser en conjonction avec SET ANSI WARNINGS pour retourner NULL chaque fois que l'erreur de division par zéro peut se produire :

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;

Résultat :

NULL

Microsoft vous recommande de toujours définir ARITHABORT sur ON dans vos sessions de connexion, et que le réglage sur OFF peut avoir un impact négatif sur l'optimisation des requêtes, entraînant des problèmes de performances.

Certains clients (tels que SQL Server Management Studio) définissent ARITHABORT sur ON par défaut. C'est pourquoi vous ne voyez probablement pas le NULL valeur renvoyée lorsque vous divisez par zéro. Vous pouvez utiliser SET ARITHIGNORE pour modifier ce comportement si vous préférez.

Option 5 :Le SET ARITHIGNORE Déclaration

Le SET ARITHIGNORE L'instruction contrôle si des messages d'erreur sont renvoyés à partir d'erreurs de débordement ou de division par zéro lors d'une requête :

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;

SET ARITHIGNORE ON;
SELECT 1 / 0 AS Result_1;

SET ARITHIGNORE OFF;
SELECT 1 / 0 AS Result_2;

Résultat :

Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
+------------+
| Result_1   |
|------------|
| NULL       |
+------------+
(1 row affected)
Commands completed successfully.
+------------+
| Result_2   |
|------------|
| NULL       |
+------------+
Division by zero occurred.

Ici, je mets ARITHABORT et ANSI_WARNINGS sur OFF afin que l'instruction n'ait pas été abandonnée en raison de l'erreur, et NULL est renvoyé chaque fois qu'il y a une erreur de division par zéro.

Notez que le SET ARITHIGNORE Le paramètre contrôle uniquement si un message d'erreur est renvoyé. SQL Server renvoie un NULL dans un calcul impliquant un débordement ou une erreur de division par zéro, quel que soit ce paramètre.

Dans l'exemple ci-dessus, nous pouvons voir que lorsque ARITHIGNORE est ON , l'erreur de division par zéro n'est pas renvoyée. Lorsqu'il est OFF , le message d'erreur de division par zéro est renvoyé.