使用CTE为块循环?(Using CTE as a block loop ?)

2019-10-30 22:20发布

除了while loopCursors

如何使用CTE表做n 操作?

例如 :

WITH cte AS (
                SELECT 1 AS n
                UNION ALL 
                SELECT n+1
                FROM   cte
                WHERE   n+1<= 10
            )

    INSERT INTO tbl1 (id) select n from cte   --till here it's all ok.
    INSERT INTO tbl2 (id) select n from cte --{notice tbl2} .fail here ( cause cte usages must come right after the decleration)

但是,有什么我可以这样做,第二行也将包括哪些内容?

PS(旁保持它作为一个临时表)

Answer 1:

一般来说,你不能。

它仅适用于下一条语句。 如果你想重用多个语句定义或将其物化到一个临时表/表变量自己重用的结果 ,你可以定义具有相同定义的视图。

对于你的问题的具体情况,你可以这样做,虽然这一切在一个声明。

WITH cte
     AS (SELECT 1 AS n
         UNION ALL
         SELECT n + 1
         FROM   cte
         WHERE  n + 1 <= 10)
INSERT INTO tbl1
            (id)
OUTPUT      INSERTED.id
INTO tbl2(id)
SELECT n
FROM   cte 


文章来源: Using CTE as a block loop ?