我们可以使用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 

是否有可能做这样吗?

+1

样本数据和预期的结果将有助于回答这个问题(事实上,所有sql问题)。 –

+0

你刚刚尝试过吗?我想它的工作 –

+0

@EstebanP。它永远不会工作。它会显示错误信息msg数据库中已经有一个名为'#tempped'的对象@ –

您可以在循环中创建临时表并将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,或光标不是最高效的解决方案。相反,使用数字或理货表。

延伸阅读:

+0

谢谢你天才..我会在6分钟后接受答案。 –

+0

@mohamedfaiz乐意帮忙! – SqlZim

+1

@mohamedfaiz我建议考虑使用复杂的CTE路线,特别是如果您将进行任何数量的严重迭代。一般来说,您希望远离基于循环的操作并坚持以SET为基础的操作! – Matt

这是一个使用递归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独到的见解......