如何在sql server中的while循环中使用select表达式?

时间:2013-01-30 13:16:10

标签: sql sql-server tsql

我需要在while循环中使用select表达式,并使用下面的示例代码:

 declare @i integer
 set @i=1
 while (@i<10)
 begin
   select @i as m;
   set @i=@i+1
 END 

此代码返回10个单独的表!我希望它将所有选择结果返回到一个表中......这可能吗?如果是的话...怎么样?

4 个答案:

答案 0 :(得分:5)

您可以使用临时表或表变量。

以下是使用临时表的方法。

CREATE TABLE #t (m INT)
DECLARE @i INT
SET @i=1
WHILE (@i<10)
BEGIN
  INSERT INTO #t SELECT @i
  SET @i=@i+1
END 
SELECT m FROM #t

与表变量

非常相似
DECLARE @t TABLE (m INT)
DECLARE @i INT
SET @i=1
WHILE (@i<10)
BEGIN
  INSERT INTO @t SELECT @i
  SET @i=@i+1
END 
SELECT m FROM @t

答案 1 :(得分:4)

这是不可能的。每个SELECT语句都会生成自己的结果集。您可以使用临时表来添加每个迭代的结果,然后在一个表中获取所有结果。要生成整数序列,可以使用它(对于SQL SERVER 2005 +)

;WITH CTE
AS
(
   SELECT 1 N
   UNION ALL
   SELECT N + 1 FROM CTE
   WHERE N<10
)
SELECT N FROM CTE

答案 2 :(得分:2)

squillman得到它...用#t(创建表# - 表在会话打开时保持在顶级范围 - 如果你有几个批处理语句,你可以在任何后声明中引用这个表,直到你删除表)

Cris也通过@test获得它(声明@ table - 变量 - 仅保留在当前作用域中 - 单个执行批处理块...请注意,如果使用它,可能会引入一些性能问题)

您可以使用的最后一种临时表是全局临时表(创建表## - 只要创建它的会话保持打开状态或直到它被删除,就会持续)

使用#t,如果不关闭会话,可能需要将其添加到脚本的开头:

IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t

享受临时表!

答案 3 :(得分:1)

declare @i integer
DECLARE @test TABLE(
  m /*your data type*/
)
 set @i=1
 while (@i<10)
 begin
   insert into @test select @i;

   set @i=@i+1
 END 

select * from @test