2016-01-13 3 views
2

Я попытался выполнить my brand-spanking-new Stored Procedure из Server Explorer, я получил:Как предотвратить ошибки «разделить на нуль» в хранимой процедуре?

Msg 8134, Level 16, State 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 терпит неудачу, потому что это не заданное значение и, таким образом, является нулевым. Я не знаю, должен ли я сделать что-то вроде этого, чтобы предотвратить 0s/аннулирует:

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 

например, если пользователь ввел «12/27/2015» для BegDate и «1/6/2016» для EndDate, эти значения должны быть:

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: // StackOverflow .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

Смежные вопросы