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