sql 中存储过程的嵌套循环不起作用
nested loop for a stored procedure in sql not working
您好,我正在尝试循环具有 month
和 year
输入的存储过程。
我试图将它从当年回溯 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
您好,我正在尝试循环具有 month
和 year
输入的存储过程。
我试图将它从当年回溯 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