Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

5 Möglichkeiten zur Behebung des „Divide by Zero“-Fehlers in SQL Server (Msg 8134)

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.