我需要在 while 循环中使用选择表达式,并使用以下示例代码:
declare @i integer
set @i=1
while (@i<10)
begin
select @i as m;
set @i=@i+1
END
此代码返回 10 个单独的表!我希望它在一个表中返回所有选择结果......这可能吗?如果是的话......如何?
我需要在 while 循环中使用选择表达式,并使用以下示例代码:
declare @i integer
set @i=1
while (@i<10)
begin
select @i as m;
set @i=@i+1
END
此代码返回 10 个单独的表!我希望它在一个表中返回所有选择结果......这可能吗?如果是的话......如何?
您可以为此使用临时表或表变量。
这是使用临时表的方法。
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
这不可能。每个SELECT
语句都会生成自己的结果集。您可以使用临时表添加每次迭代的结果,然后将所有结果放在一个表中。要生成整数序列,您可以使用它(对于 SQL SERVER 2005 + )
;WITH CTE
AS
(
SELECT 1 N
UNION ALL
SELECT N + 1 FROM CTE
WHERE N<10
)
SELECT N FROM CTE
squillman 知道了...with #t (create table # - table 在会话打开时保留在顶级范围内 - 如果您有多个批处理语句,您可以在任何 after 声明中引用此表,直到您删除表)
Cris 也通过 @test 得到了它(声明 @table - 变量 - 仅在当前范围内持久化 - 单个执行批处理块...请注意,如果使用它,可能会引入几个性能问题)
您可以使用的最后一种临时表是全局临时表(创建表## - 只要创建它的会话保持打开状态或直到它被删除,它就会持续存在)
使用#t,如果您不关闭会话,您可能希望将其添加到脚本的开头:
IF OBJECT_ID('tempdb..#t') IS NOT NULL
DROP TABLE #t
享受临时表!
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