我们可以使用SQL Server中的while循环将记录存储在临时表中吗?

时间:2017-08-08 17:52:28

标签: sql sql-server stored-procedures

我有一个场景,使用while循环将记录存储在临时表中。

例如

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5)
BEGIN
    PRINT @intFlag
    SET @intFlag = @intFlag + 1
    select @intFlag datas
    into #tempped
END
GO

可以这样做吗?

3 个答案:

答案 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原始观点......