вложенный цикл для хранимой процедуры в sql не работает

#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