我有以下SQL查询:
DECLARE @MyVar datetime = '1/1/2010'
SELECT @MyVar
这自然会返回'1/1/2010‘。
我想做的是有一个日期列表,比如:
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
所以这将返回:-
2010年1/1 2/1 2010 3/1 2010 4/1/2010 5/1
我希望这样返回的数据是一个结果集,而不是多个结果集,所以我可能需要在查询的末尾使用某种联合,这样循环的每次迭代都会联合到下一个循环。
编辑
我有一个接受'to date‘参数的大型查询,我需要运行它24次,每次使用我需要能够提供的特定to date (这些日期将是动态的),我希望避免重复24次联合all连接它们的查询,好像我需要回来并添加额外的列,这将是非常耗时的。
发布于 2012-04-24 22:57:06
SQL主要是一种面向集合的语言-在其中使用循环通常不是一个好主意。
在这种情况下,使用递归CTE可以获得类似的结果:
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
发布于 2012-04-24 22:54:22
下面是一个带有表变量的选项:
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所说的,这可能是另一种(更有效的)方式。
发布于 2012-04-24 22:55:17
您可以使用变量表,如下所示:
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
https://stackoverflow.com/questions/10300414
复制相似问题