我有一个场景,使用while循环将记录存储在临时表中。
例如
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5)
BEGIN
PRINT @intFlag
SET @intFlag = @intFlag + 1
select @intFlag datas
into #tempped
END
GO
可以这样做吗?
答案 0 :(得分:3)
这是使用递归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)
答案 1 :(得分:2)
您可以从循环中创建临时表和f()
。 e.g:
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
循环,递归cte或游标不是最高效的解决方案。相反,请使用数字或计数表。
进一步阅读:
答案 2 :(得分: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
关于这一点的好处是你可以用它创建一个视图......而且永远不必再担心这个问题。也就是说,只要你需要一个&#34;数字表&#34;你就可以引用这个视图。加入。
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原始观点......