有没有一种方法可以在SQL中循环

时间:2019-10-23 14:44:08

标签: sql sql-server-2012

我正在尝试使用SQL创建每月的“预测”流程。我已经为Jan创建了一个查询,希望查看是否有可能在每个额外的月份中循环并将结果存储在Temporary表中。

逻辑上,我想将@DMonth变量设置为1,运行查询,将结果存储/追加到临时表中,循环...

将@DMonth变量设置为2,运行查询,将结果存储/追加到临时表中,循环...

等。依次设置@DMonth直到它达到12,然后退出循环。

查询中的示例变量:

Declare @DMonth int;
set @DMonth = 1

我认为我需要将@DMonth变量的Setting设置为Loop。

2 个答案:

答案 0 :(得分:0)

尚不清楚您真正想在循环中做什么,但是这是如何循环并在临时表中保存月份的方法:

CREATE TABLE #temp(mon int);

Declare @StartDate DATETIME = '2016-09-01',
        @EndDate DATETIME = '2017-01-31'


-- Now you have 12 months and you can use below query to loop through each month starting from January 

WHILE (@StartDate <= @EndDate)
BEGIN
    DECLARE @Month INT = Month(@StartDate) -- At the start of loop @Month is equal to 9 

    -- Save @Month to temp table in each repeat 
    INSERT INTO #temp (mon)
    SELECT @Month;

    SET @StartDate = DATEADD(MONTH, 1, @StartDate); -- this line adds 1 value to @Month after first loop @Month will be 10 
END

如果您想从@StartDate(2016年9月)开始循环,然后在@EndDate(2017年1月)结束循环,上述查询将执行完全相同的过程。但是,如果要将@StartDate更改为2016-01-01,将@EndDate更改为2016-12-31,请使用以下查询:

CREATE TABLE #temp(mon int);

Declare @StartDate DATETIME = DATEADD(MONTH, -8, '2016-09-01'); -- It will set @StartDate to '2016-01-01' 
Declare @EndDate DATETIME = DATEADD(MONTH, 11, DATEADD(YEAR, -1, '2017-01-31')); -- It will set @EndDate to '2016-12-31'

-- Now you have 12 months and you can use below query to loop through each month starting from January 

WHILE (@StartDate <= @EndDate)
BEGIN
    DECLARE @Month INT = Month(@StartDate) -- At the begining @Month is equal to 1 

    -- Save @Month to temp table in each repeat 
    INSERT INTO #temp (mon)
    SELECT @Month;

    SET @StartDate = DATEADD(MONTH, 1, @StartDate); -- this line adds 1 value to @Month after first loop @Month will be 2 
END

答案 1 :(得分:0)

当然,您可以在sql中循环。语法略有不同但相似,如果您了解基本编码,就可以轻松理解它,但是我们只能在sql中使用while循环。 语法如下所示。  while循环。我们基本上使用

当(n