如何在sql中处理除零错误

时间:2017-05-27 03:30:59

标签: sql sql-server sql-server-2008

cast(CAST(countAta AS float) 
 / CAST(DATEDIFF(day,@searchDate,@EndDate) AS float) as  decimal(16,2)
    )

4 个答案:

答案 0 :(得分:1)

您可以通过在查询之前设置以下参数来避免此类情况,它应该可以正常工作。

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF

当您执行以下操作时,这将返回NULL123 / 0

重要的是,完成此类操作后,请将这些属性设置为ON。当您在存储过程中遇到复杂查询并且您不希望最终编写越来越多的CASE语句来处理这种情况时,这尤其有用。

希望这有帮助!!!

答案 1 :(得分:0)

您应该始终使用TRY-CATCH块并使用SQL提供的内置错误处理函数。此外,您可以用另一种方式处理它 -

SELECT CASE 
    WHEN (CAST(DATEDIFF(Day, @searchDate, @EndDate) AS FLOAT) AS DECIMAL(16, 2)) = 0
        THEN NULL -- Ideally it should return NULL but you can change it as per your requirement
    ELSE CAST(CAST(Counter AS FLOAT) / CAST(DATEDIFF(Day, @searchDate, @EndDate) AS FLOAT) AS DECIMAL(16, 2))
    END

答案 2 :(得分:0)

最好的方法是NULLIF()。 。 。但是你无法将值转回0

select CAST(CAST(countAta AS float) /
            NULLIF(DATEDIFF(day, @searchDate, @EndDate), 0
                  ) as  decimal(16, 2)
           )

如果分母为0,则返回NULL。请注意,您不必两次转换为浮点数。

答案 3 :(得分:-1)

您可以使用NULLIF来避免零错误。 当分母等于0时,它返回NULL

CAST(countAta AS decimal(16,2)) /ISNULL(NULLIF(DATEDIFF(day,@searchDate,@EndDate),0), 1)

或使用CASE WHEN

CAST(countAta AS decimal(16,2)) /
CASE WHEN DATEDIFF(day,@searchDate,@EndDate) = 0 THEN 1 
     ELSE DATEDIFF(day,@searchDate,@EndDate) 
END