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

如何在sql server的while循环中使用select表达式?,sql,sql-server,tsql,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个单独的表!我希望它在一个表中返回所有select结果。。。可能吗?如果是。。。怎么做?这是不可能的。每个SELECT语句都生成自己的结果集。您可以使用临时表添加每个迭代的结果,然后在一个表中获得所有结果。要生成整数序列,可

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

 declare @i integer
 set @i=1
 while (@i<10)
 begin
   select @i as m;
   set @i=@i+1
 END 
此代码返回10个单独的表!我希望它在一个表中返回所有select结果。。。可能吗?如果是。。。怎么做?

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

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

您可以为此使用临时表或表变量

下面是如何使用临时表来执行此操作

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

squillman明白了…使用t create table-会话打开时,table保持在顶级作用域中-如果您有多个batch语句,您可以在任何after声明中引用该表,直到删除该表为止

Cris还通过@test declare@table-variable得到了它-仅在当前作用域中持久化-单执行批处理块…请注意,如果使用此方法,可能会引入一些性能问题

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

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

IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t
享受临时桌

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