Sometimes it is inevitable to encounter scenarios that will give division by zero errors


DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT @dividend/@divisor

/* 
Error:
Msg 8134, Level 16, State 1, Line 7
Divide by zero error encountered.
*/

What you can do is you can code around it, so your users and your app do not get this error.

Alternative 1: NULLIF (preferred)

The NULLIF built in function returns a NULL if the two parameters are equal. In our case, we want to check if the divisor is zero.


DECLARE @dividend INT
DECLARE @divisor INT

SET @dividend = 1
SET @divisor = 0

SELECT @dividend/NULLIF(@divisor,0)

/* 
Returns NULL
*/

Alternatively, instead of NULL, you may want to display just 0


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

/* 
Returns NULL, no error
*/

Alternative 2: CASE

You can also use CASE to drive what values you want to show if the divisor. The downside to this approach is your code can get really lengthy right away by having multiple CASE statements.


SELECT 
	CASE @divisor
	   WHEN 0 THEN 0
	   ELSE @dividend/NULLIF(@divisor,0)
	END

/* 
Returns 0, no error
*/

Alternative 3: IF/ELSE

You can also use IF/ELSE. However this means you cannot just have one SELECT statement. This needs to be in a script, a stored proc, or UDF.


IF @divisor = 0
BEGIN
   SELECT 0
END
ELSE BEGIN
   SELECT @dividend/@divisor
END


/* 
Returns 0, no error
*/

There you go. No more division by zero woes in T-SQL.

VN:F [1.9.22_1171]
Rating: 8.7/10 (31 votes cast)
VN:F [1.9.22_1171]
Rating: +8 (from 8 votes)
Handling Division By Zero Scenarios in T-SQL, 8.7 out of 10 based on 31 ratings
Be Sociable, Share!