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.