Hier zijn vijf opties voor het omgaan met fout Msg 8134 "Delen door nul opgetreden fout" in SQL Server.
De fout
Ten eerste is hier een voorbeeld van code die de fout veroorzaakt waar we het over hebben:
SELECT 1 / 0;
Resultaat:
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
We krijgen de fout omdat we proberen een getal door nul te delen. Wiskundig gezien slaat dit nergens op. Je kunt een getal niet door nul delen en een zinvol resultaat verwachten.
Om met deze fout om te gaan, moeten we beslissen wat er moet worden geretourneerd wanneer we proberen te delen door nul. We willen bijvoorbeeld dat een null-waarde wordt geretourneerd. Of we willen misschien dat nul wordt geretourneerd. Of een andere waarde.
Hieronder staan enkele opties om met deze fout om te gaan.
Optie 1:De NULLIF()
Uitdrukking
Een snelle en gemakkelijke manier om met deze fout om te gaan, is door de NULLIF()
. te gebruiken uitdrukking:
SELECT 1 / NULLIF( 0, 0 );
Resultaat:
NULL
NULLIF()
retourneert NULL
als de twee opgegeven expressies dezelfde waarde hebben. Het retourneert de eerste uitdrukking als de twee uitdrukkingen verschillend zijn. Daarom, als we nul gebruiken als de tweede uitdrukking, krijgen we een null-waarde wanneer de eerste uitdrukking nul is. Een getal delen door NULL
resulteert in NULL
.
Eigenlijk retourneert SQL Server al NULL
op een fout door nul delen, maar in de meeste gevallen zien we dit niet vanwege onze ARITHABORT
en ANSI_WARNINGS
instellingen (hierover later meer).
Optie 2:voeg de ISNULL()
. toe Functie
In sommige gevallen geeft u er misschien de voorkeur aan een andere waarde te retourneren dan NULL
.
In dergelijke gevallen kunt u het vorige voorbeeld doorgeven aan de ISNULL()
functie:
SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);
Resultaat:
0
Hier heb ik gespecificeerd dat nul moet worden geretourneerd wanneer het resultaat NULL
is .
Wees echter voorzichtig. In sommige gevallen kan het retourneren van nul ongepast zijn. Als u bijvoorbeeld te maken heeft met voorraadvoorraden, kan het opgeven van nul betekenen dat er nul producten zijn, wat mogelijk niet het geval is.
Optie 3:Gebruik een CASE
Verklaring
Een andere manier om dit te doen is door een CASE
. te gebruiken verklaring:
DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;
SELECT CASE
WHEN @n2 = 0
THEN NULL
ELSE @n1 / @n2
END
Resultaat:
NULL
Optie 4:De SET ARITHABORT
Verklaring
De SET ARITHABORT
instructie beëindigt een query wanneer een overloop- of deling-door-nul-fout optreedt tijdens het uitvoeren van de query. We kunnen het gebruiken in combinatie met SET ANSI WARNINGS
om NULL
terug te geven wanneer de fout door nul kan optreden:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;
Resultaat:
NULL
Microsoft raadt u aan altijd ARITHABORT
. in te stellen naar ON
in uw aanmeldingssessies, en dat u het op OFF
. zet kan de optimalisatie van zoekopdrachten negatief beïnvloeden, wat leidt tot prestatieproblemen.
Sommige clients (zoals SQL Server Management Studio) stel ARITHABORT
in naar ON
standaard. Dit is de reden waarom je waarschijnlijk de NULL
. niet ziet waarde die wordt geretourneerd wanneer u deelt door nul. U kunt SET ARITHIGNORE
. gebruiken om dit gedrag desgewenst te wijzigen.
Optie 5:De SET ARITHIGNORE
Verklaring
De SET ARITHIGNORE
instructie bepaalt of foutmeldingen worden geretourneerd door overloop- of deel-door-nul-fouten tijdens een query:
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;
Resultaat:
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.
Hier stel ik ARITHABORT
in en ANSI_WARNINGS
naar OFF
zodat de instructie niet werd afgebroken vanwege de fout, en NULL
wordt geretourneerd wanneer er een fout bij het delen door nul is.
Merk op dat de SET ARITHIGNORE
instelling bepaalt alleen of er een foutbericht wordt geretourneerd. SQL Server retourneert een NULL
in een berekening met een overloop- of deling-door-nulfout, ongeacht deze instelling.
In het bovenstaande voorbeeld kunnen we zien dat wanneer ARITHIGNORE
is ON
, wordt de fout door deling door nul niet geretourneerd. Als het OFF
is , wordt de foutmelding gedeeld door nul geretourneerd.