首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server FOR EACH循环

SQL Server FOR EACH循环
EN

Stack Overflow用户
提问于 2012-04-24 22:49:53
回答 7查看 535.8K关注 0票数 65

我有以下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连接它们的查询,好像我需要回来并添加额外的列,这将是非常耗时的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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
票数 69
EN

Stack Overflow用户

发布于 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所说的,这可能是另一种(更有效的)方式。

票数 31
EN

Stack Overflow用户

发布于 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
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10300414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档