sql >> Database >  >> RDS >> Sqlserver

5 manieren om de fout "Delen door nul" in SQL Server op te lossen (Msg 8134)

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.


  1. 3 manieren om de serversortering in MariaDB te krijgen

  2. Oracle-gegevensbronconfiguratie voor Spring

  3. bijwerken en comprimeren van sqlite-database in Android

  4. Ontdek 10 minder bekende mogelijkheden van SQL Diagnostic Manager