Division by Zero (Division durch 0) abfangen

Wer kennt sie nicht, die Fehlermeldung bei Division durch 0:

DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT @dividend / @divisor

/*
Rückgabewert:
Meldung 8134, Ebene 16, Status 1, Zeile 7
Fehler aufgrund einer Division durch Null.
*/

Ich möchte heute einmal verschiedene Möglichkeiten erörtern, um solch eine Fehlermeldung in SQL-Server bei einer Division durch 0 abzufangen.

Oftmals passieren solche Fehler erst nach längerer Zeit, d. h. wenn die zugrundeliegenden Tabellen / Spalten aufgrund der Daten anwachsen. Welche Möglichkeiten gibt es um diesen Fehler zu vermeiden? Hier die Verschiedenen Alternativen:

Alternative 1: CASE

DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT CASE
WHEN @divisor = 0 THEN NULL
ELSE @dividend / @divisor
END

/*
Rückgabewert = NULL
*/

Alternative 2: NULLIF

DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT@dividend / NULLIF(@divisor , 0)

/*
Rückgabewert = NULL
*/

Alternative 2: NULLIF mit alternativem Rückgabewert

DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT COALESCE(@dividend / NULLIF(@divisor , 0), 0)

/*
Rückgabewert = 0
*/

Alternative 4: Eine einfache Funktion


IF EXISTS (SELECT * FROM dbo.sysobjects WHERE NAME = ‚division‘) DROP FUNCTION division

go

CREATE FUNCTION dbo.division( @dividend decimal(38, 10), @divisor decimal(38, 10))
returns decimal(38, 10)
BEGIN

   DECLARE @ergebnis decimal(38, 10);
SELECT @ergebnis = NULL;
IF ( @divisor IS NOT NULL
AND @divisor <> 0
AND @dividend IS NOT NULL )
SELECT @ergebnis = @dividend / @divisor;
RETURN( @ergebnis )
END

go

Alternative 5: ARITHABORT

Beendet eine Abfrage, wenn während der Abfrage ein Überlauffehler oder ein Fehler aufgrund einer Division durch 0 (null) auftritt.

SET ARITHABORT OFF
SET ANSI_WARNINGS OFF

DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT @dividend / @divisor

/*
Rückgabewert = NULL
*/

SET ARITHABORT ON
SET ANSI_WARNINGS ON

Die Einstellung von SET ARITHABORT wird zur Ausführungszeit und nicht zur Analysezeit festgelegt.

Auch wenn SET ARITHABORT auf OFF und SET ANSI_WARNINGS auf ON festgelegt sind, gibt der SQL Server eine Fehlermeldung zurück, wenn ein Fehler aufgrund einer Division durch Null oder ein Überlauffehler auftritt.

Um abzufragen welche Einstellung für ARITHABORT festgelegt ist, kann man den folgenden Code ausführen:

DECLARE @ARITHABORT VARCHAR(3) = ‚OFF‘;
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = ‚ON‘;
SELECT @ARITHABORT AS ARITHABORT;

Welche Methode nun die beste ist, kommt immer auf den einzelnen Fall an. Sollte jemand bessere Alternativen kennen, dann gerne kommentieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Captcha * Time limit is exhausted. Please reload CAPTCHA.