我们可以使用SQL Server中的while循环将记录存储在临时表中吗?
问题描述:
我有一个场景,使用while循环如下所示将临时表中的记录存储在临时表中。我们可以使用SQL Server中的while循环将记录存储在临时表中吗?
对于实例
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5)
BEGIN
PRINT @intFlag
SET @intFlag = @intFlag + 1
select @intFlag datas
into #tempped
END
GO
是否有可能做这样吗?
答
您可以在循环中创建临时表并将insert
创建到它中。例如: -
create table #tempped (datas int);
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5)
BEGIN
PRINT @intFlag;
insert into #tempped (datas)
select @intFlag;
SET @intFlag = @intFlag + 1;
END
GO
我认为这个问题是一个抽象的,如果你有兴趣在性能上则while
循环,递归CTE,或光标不是最高效的解决方案。相反,使用数字或理货表。
延伸阅读:
答
这是一个使用递归CTE另一种解决方案:
;WITH
cte(datas) AS
(
SELECT 1
UNION ALL
SELECT datas + 1
FROM cte
WHERE datas < 5
)
SELECT datas
INTO #tempped
FROM cte
OPTION (MAXRECURSION 0)
答
TALLY CTE
的另一种选择。这将工作长达10K记录...
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N
INTO #tempped
FROM cteTally
WHERE N <= 5
SELECT * FROM cteTally
SELECT * FROM #tempped
DROP TABLE #tempped
关于这个良好的部分是你可以创建一个视图,它...从来没有以后再担心这个问题。也就是说,只要需要“数字表”加入,就可以引用该视图。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
然后,你的榜样,你只是这样做:
SELECT N
INTO #tempped
FROM cteTally
WHERE N <=5
Sean Lange独到的见解......
样本数据和预期的结果将有助于回答这个问题(事实上,所有sql问题)。 –
你刚刚尝试过吗?我想它的工作 –
@EstebanP。它永远不会工作。它会显示错误信息msg数据库中已经有一个名为'#tempped'的对象@ –