sql 中存储过程的嵌套循环不起作用

nested loop for a stored procedure in sql not working

您好,我正在尝试循环具有 monthyear 输入的存储过程。

我试图将它从当年回溯 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'

有了这个,我只得到 2021 年的 12 个月,而不是 2020 年的 12 个月。

感谢帮助

除了一个小问题,您的代码一切都很好。

您没有将 @CurrentMonth 的值重置回 1,以便内部循环可以再次 运行(12 次)

    .............
    Set @CurrentMonth = @CurrentMonth + 1
            END 
            Set @CurrentYear = @CurrentYear - 1
            Set @CurrentMonth = 1 //resetting back to first month

问题是 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