每个循环的SQL Server

我有以下SQL查询:

DECLARE @MyVar datetime = '1/1/2010' SELECT @MyVar 

这自然会返回“2010年1月1日”。

我想要做的是有一个date列表,说:

 1/1/2010 2/1/2010 3/1/2010 4/1/2010 5/1/2010 

然后我想要通过数字每个运行SQL查询。

像(伪代码):

 List = 1/1/2010,2/1/2010,3/1/2010,4/1/2010,5/1/2010 For each x in List do DECLARE @MyVar datetime = x SELECT @MyVar 

所以这将返回: –

1/1/2010 2/1/2010 3/1/2010 4/1/2010 5/1/2010

我希望这是返回数据作为一个结果集,而不是多个结果集,所以我可能需要在查询结束时使用某种联合,所以循环的每个迭代联合到下一个。

编辑

我有一个大的查询,接受一个“到date”参数,我需要运行它24次,每次具体的date,我需要能够提供(这些date将是dynamic的),我想避免重复我的查询24次与联盟所有人join他们,如果我需要回来,并添加额外的列这将是非常耗时。

SQL主要是一种面向集合的语言 – 在其中使用循环通常是一个糟糕的主意。

在这种情况下,使用recursionCTE可以实现类似的结果:

 with cte as (select 1 i union all select i+1 i from cte where i < 5) select dateadd(d, i-1, '2010-01-01') from cte 

这是一个表variables的选项:

 DECLARE @MyVar TABLE(Val DATETIME) DECLARE @I INT, @StartDate DATETIME SET @I = 1 SET @StartDate = '20100101' WHILE @I <= 5 BEGIN INSERT INTO @MyVar(Val) VALUES(@StartDate) SET @StartDate = DATEADD(DAY,1,@StartDate) SET @I = @I + 1 END SELECT * FROM @MyVar 

你可以用临时表来做同样的事情:

 CREATE TABLE #MyVar(Val DATETIME) DECLARE @I INT, @StartDate DATETIME SET @I = 1 SET @StartDate = '20100101' WHILE @I <= 5 BEGIN INSERT INTO #MyVar(Val) VALUES(@StartDate) SET @StartDate = DATEADD(DAY,1,@StartDate) SET @I = @I + 1 END SELECT * FROM #MyVar 

你应该告诉我们你的主要目标是什么,正如@JohnFx所说,这可能是另一种(更有效的)方式。

你可以使用一个variables表,如下所示:

 declare @num int set @num = 1 declare @results table ( val int ) while (@num < 6) begin insert into @results ( val ) values ( @num ) set @num = @num + 1 end select val from @results 

这种取决于你想要对结果什么。 如果你只是在数字之后,一个基于集合的选项将是一个数字表 – 这对于各种事情来说都非常方便。

对于MSSQL 2005+,可以使用recursionCTE以内联方式生成数字表:

 ;WITH Numbers (N) AS ( SELECT 1 UNION ALL SELECT 1 + N FROM Numbers WHERE N < 500 ) SELECT N FROM Numbers OPTION (MAXRECURSION 500) 
 declare @counter as int set @counter = 0 declare @date as varchar(50) set @date = cast(1+@counter as varchar)+'/01/2013' while(@counter < 12) begin select cast(1+@counter as varchar)+'/01/2013' as date set @counter = @counter + 1 end 
 [CREATE PROCEDURE [rat].[GetYear] AS BEGIN -- variable for storing start date Declare @StartYear as int -- Variable for the End date Declare @EndYear as int -- Setting the value in strat Date select @StartYear = Value from rat.Configuration where Name = 'REPORT_START_YEAR'; -- Setting the End date select @EndYear = Value from rat.Configuration where Name = 'REPORT_END_YEAR'; -- Creating Tem table with [Years] as ( --Selecting the Year select @StartYear [Year] --doing Union union all -- doing the loop in Years table select Year+1 Year from [Years] where Year < @EndYear ) --Selecting the Year table selec] 

当然还有一个老问题。 但我有一个简单的解决scheme,无需循环,CTE,表variables等

 DECLARE @MyVar datetime = '1/1/2010' SELECT @MyVar SELECT DATEADD (DD,NUMBER,@MyVar) FROM master.dbo.spt_values WHERE TYPE='P' AND NUMBER BETWEEN 0 AND 4 ORDER BY NUMBER