2016-01-13 56 views
2

我试图从服务器资源管理器执行my brand-spanking-new Stored Procedure,我得到:如何防止存储过程中的除零错误?

消息8134,级别16,状态1,过程duckbilledPlatypi,13号线 除以零遇到的错误。

这里是(13)牵连的行:

@Week1End Week1End, 

...和在多个上下文:

DECLARE 
@Week1End datetime, 
@Week2begin datetime 

Select Ind.Description, 
    @BegDate BegDate, 
    @Week1End Week1End, 
    @Week1End Week2Begin, 
    @EndDate EndDate, 

对于充分披露/上下文中,这里是在整个SP,因为它现在存在:

CREATE PROCEDURE [dbo].[duckbilledPlatypi] 
    @Unit varchar(25), 
    @BegDate datetime, 
    @EndDate datetime 
AS 

DECLARE 
@Week1End datetime, 
@Week2begin datetime 

Select Ind.Description, 
    @BegDate BegDate, 
    @Week1End Week1End, 
    @Week1End Week2Begin, 
    @EndDate EndDate, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.QtyShipped ELSE 0 END) 
Week1Usage, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 END) 
Week2Usage, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) 
Week1Price, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.QtyShipped ELSE 0 END) 
UsageVariance, 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) 
PriceVariance, 
    (SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 
END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)) 
    /SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) 
PercentageOfPriceVariance 
    From InvoiceDetail Ind 
    Where Ind.Unit = @Unit 
    AND Ind.InvoiceDate BETWEEN @BegDate AND @EndDate 
    Group By Ind.Description 

我的猜测是@ Week1End Week1End失败,因为它不是给定一个值,因此是空的。我不知道我是否应该做这样的事情,以防止0 /空:

DECLARE 
@Week1End datetime = BegDate + 6; 
@Week2begin datetime = BegDate + 7; 

...或者是这样的:

Select Ind.Description, 
    @BegDate BegDate, 
    @Week1End BegDate+6, 
    @Week2Begin BegDate+7, 
    @EndDate EndDate, 

...或别的东西完全。

正如你可能会说,我不知道日期数学应该如何实际完成。什么日期,真正需要的是有:

Week1Begin is the "BegDate" the user provided as a parameter 
Week1End needs to be six days after Week1Begin 
Week2Begin needs to be seven days after Week1Begin 
Week2End is the "EndDate" the user provided as a parameter 

例如,如果用户输入“2015年12月27日”为BegDate和“2016年1月6日”为结束日期,这些值必须是:

Week1Begin = 12/27/2015 
Week1End = 1/2/2016 
Week2Begin = 1/3/2016 
Week2End = 1/6/2016 (week2 is only a four-day week in this case, due to what the user entered) 

我该怎么做才能确保在这里没有发生零点的div?

+0

【如何“被零除”,以避免错误的SQL?(HTTP的可能重复://计算器.com/questions/861778/how-to-avoid-the-divide-by-zero-error-in-sql) –

回答

2

你可以使用NULLIF

(SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 
END) - 
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)) 
    /NULLIF(SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END),0) 
PercentageOfPriceVariance 

所以当除数是0的enitre结果将是NULL。如果你需要的话特殊值增加COALESCE

COALESCE(exp1/NULLIF(exp2, 0), special_value) AS result 

LiveDemo

+0

我想我必须把“NULLIF”放到这里才能工作? –

+1

@ B.ClayShannon仅限于除法表达式 – lad2025