Я попытался выполнить 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 по нулям?
Возможный дубликат [Как избежать "деление на ноль" ошибка в SQL?] (HTTP: // StackOverflow .com/questions/861778/how-to-avoid-the-divide-by-zero-error-in-sql) –