2

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

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

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

4

4 回答 4

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
于 2013-01-30T13:19:09.413 回答
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
于 2013-01-30T13:18:55.057 回答
2

squillman 知道了...with #t (create table # - table 在会话打开时保留在顶级范围内 - 如果您有多个批处理语句,您可以在任何 after 声明中引用此表,直到您删除表)

Cris 也通过 @test 得到了它(声明 @table - 变量 - 仅在当前范围内持久化 - 单个执行批处理块...请注意,如果使用它,可能会引入几个性能问题)

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

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

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

享受临时表!

于 2013-01-30T13:33:26.803 回答
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
于 2013-01-30T13:21:53.913 回答