#sql #loops #stored-procedures
Вопрос:
Привет, я пытаюсь выполнить цикл хранимой процедуры, которая имеет month
year
входы a и.
Я пытаюсь зациклить его на 24 месяца назад с текущего года, но проблема в том, что я получаю только месяцы и годы за текущий год, это не дает мне полных 24 месяцев
это код, который у меня есть
CREATE OR ALTER PROCEDURE GetCallReport
@YearParam nvarchar(4)
@MonthParam nvarchar(2)
AS
--BEGIN
SET NOCOUNT ON
DECLARE @CurrentYear INT
DECLARE @CurrentMonth INT
SET @CurrentYear = CAST(@YearParam AS INT)
SET @CurrentMonth = 1
WHILE (@CurrentYear >= (CAST(@YearParam AS INT) -1))
BEGIN
WHILE (@CurrentMonth <= 12)
BEGIN
EXEC GetPrincipalReport @MonthParam = @CurrentMonth ,@YearParam = @CurrentYear
Set @CurrentMonth = @CurrentMonth 1
END
Set @CurrentYear = @CurrentYear - 1
END
--END
--EXEC PROCEDURE
EXEC GetCallReport @YearParam = '2021'
при этом я получаю только 12 месяцев 2021 года, но не 12 2020 года.
Спасибо за помощь
Ответ №1:
В вашем коде все хорошо, за исключением небольшой проблемы.
Вы не сбрасываете значение @CurrentMonth
обратно 1
, чтобы внутренний цикл мог выполняться снова (12 раз)
.............
Set @CurrentMonth = @CurrentMonth 1
END
Set @CurrentYear = @CurrentYear - 1
Set @CurrentMonth = 1 //resetting back to first month
Ответ №2:
Проблема в том, что current_month не сбрасывается после выполнения первого цикла current_year.
Гораздо более чистым способом, на мой взгляд, было бы использование арифметики дат.
ALTER PROCEDURE dbo.GetCallReport
@YearParam nvarchar(4)
,@MonthParam nvarchar(2)
AS
--BEGIN
SET NOCOUNT ON
DECLARE @i int
DECLARE @report_date date
SET @i = 1
SET @report_date = CAST(CONCAT(@YearParam,'-',@MonthParam,'-01') as DATE)
WHILE (@i<=24)
BEGIN
EXEC GetPrincipalReport @MonthParam = DATEPART(MONTH,DATEADD(MONTH,-@i,@report_date))
,@YearParam = DATEPART(MONTH,DATEADD(MONTH,-@i,@report_date))
SET @i = @i 1
END