Division by Zero

Fehlermeldung in SQL-Server bei einer Division durch 0 abfangen

Verschiedene Alternativen und deren konkrete Vorgehensweise.

Newsletter abonnieren



Methoden zur Vorgehensweise

Die Fehlermeldung bei Divison durch 0 ist ein häufiges Problem im SQL-Server:

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.
*/

In diesem Beitrag sollen verschiedene Möglichkeiten erörtert werden, um diese Fehlermeldung im 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?

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 3: 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 vorliegenden Fall an. Sie haben Rückfragen? Dann wenden Sie sich gerne über unsere Kontaktseite oder telefonisch unter +49 7331 3076 – 0 an unsere Experten.

FacebookLinkedIn