簡體   English   中英

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM