Hier sind fünf Optionen für den Umgang mit Fehlernachricht 8134 „Fehler bei Division durch Null“ im SQL-Server.
Der Fehler
Zuerst ist hier ein Codebeispiel, das den Fehler erzeugt, über den wir sprechen:
SELECT 1 / 0;
Ergebnis:
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
Wir erhalten den Fehler, weil wir versuchen, eine Zahl durch Null zu teilen. Mathematisch ergibt das keinen Sinn. Sie können eine Zahl nicht durch Null teilen und ein aussagekräftiges Ergebnis erwarten.
Um diesen Fehler zu beheben, müssen wir entscheiden, was zurückgegeben werden soll, wenn wir versuchen, durch Null zu dividieren. Beispielsweise möchten wir möglicherweise, dass ein Nullwert zurückgegeben wird. Oder wir möchten vielleicht, dass Null zurückgegeben wird. Oder ein anderer Wert.
Nachfolgend finden Sie einige Optionen zur Behandlung dieses Fehlers.
Option 1:Das NULLIF()
Ausdruck
Eine schnelle und einfache Möglichkeit, mit diesem Fehler umzugehen, ist die Verwendung von NULLIF()
Ausdruck:
SELECT 1 / NULLIF( 0, 0 );
Ergebnis:
NULL
NULLIF()
gibt NULL
zurück wenn die beiden angegebenen Ausdrücke denselben Wert haben. Es gibt den ersten Ausdruck zurück, wenn die beiden Ausdrücke unterschiedlich sind. Wenn wir also Null als zweiten Ausdruck verwenden, erhalten wir immer dann einen Nullwert, wenn der erste Ausdruck Null ist. Dividieren einer Zahl durch NULL
ergibt NULL
.
Tatsächlich gibt SQL Server bereits NULL
zurück auf einen Division-durch-Null-Fehler, aber in den meisten Fällen sehen wir dies aufgrund unseres ARITHABORT
nicht und ANSI_WARNINGS
Einstellungen (dazu später mehr).
Option 2:Fügen Sie ISNULL()
hinzu Funktion
In manchen Fällen ziehen Sie es vielleicht vor, einen anderen Wert als NULL
zurückzugeben .
In solchen Fällen können Sie das vorherige Beispiel an ISNULL()
übergeben Funktion:
SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);
Ergebnis:
0
Hier habe ich angegeben, dass Null zurückgegeben werden soll, wenn das Ergebnis NULL
ist .
Seien Sie jedoch vorsichtig. In einigen Fällen ist die Rückgabe von Null möglicherweise unangemessen. Wenn Sie es beispielsweise mit Lagerbeständen zu tun haben, kann die Angabe von null bedeuten, dass es null Produkte gibt, was möglicherweise nicht der Fall ist.
Option 3:Verwenden Sie einen CASE
Erklärung
Eine andere Möglichkeit ist die Verwendung eines CASE
Aussage:
DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;
SELECT CASE
WHEN @n2 = 0
THEN NULL
ELSE @n1 / @n2
END
Ergebnis:
NULL
Option 4:Der SET ARITHABORT
Erklärung
Der SET ARITHABORT
-Anweisung beendet eine Abfrage, wenn während der Abfrageausführung ein Überlauf- oder Division-durch-Null-Fehler auftritt. Wir können es in Verbindung mit SET ANSI WARNINGS
verwenden um NULL
zurückzugeben wann immer der Division-durch-Null-Fehler auftreten könnte:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;
Ergebnis:
NULL
Microsoft empfiehlt, immer ARITHABORT
zu setzen auf ON
in Ihren Anmeldesitzungen und das Setzen auf OFF
kann sich negativ auf die Abfrageoptimierung auswirken und zu Leistungsproblemen führen.
Einige Clients (wie SQL Server Management Studio) setzen ARITHABORT
auf ON
standardmäßig. Aus diesem Grund sehen Sie wahrscheinlich nicht NULL
Wert, der zurückgegeben wird, wenn Sie durch Null dividieren. Sie können SET ARITHIGNORE
verwenden um dieses Verhalten zu ändern, wenn Sie möchten.
Option 5:Das SET ARITHIGNORE
Erklärung
Das SET ARITHIGNORE
-Anweisung steuert, ob Fehlermeldungen von Überlauf- oder Division-durch-Null-Fehlern während einer Abfrage zurückgegeben werden:
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;
Ergebnis:
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 setze ich ARITHABORT
und ANSI_WARNINGS
auf OFF
damit die Anweisung nicht wegen des Fehlers abgebrochen wurde, und NULL
wird zurückgegeben, wenn ein Division-durch-Null-Fehler auftritt.
Beachten Sie, dass SET ARITHIGNORE
Die Einstellung steuert nur, ob eine Fehlermeldung zurückgegeben wird. SQL Server gibt ein NULL
zurück in einer Berechnung mit einem Überlauf- oder Division-durch-Null-Fehler, unabhängig von dieser Einstellung.
Im obigen Beispiel können wir das sehen, wenn ARITHIGNORE
ist ON
, wird der Division-durch-Null-Fehler nicht zurückgegeben. Wenn es OFF
ist , wird die Fehlermeldung Division durch Null zurückgegeben.