2016-01-13 57 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