使用CTE作为块循环?

时间:2013-01-06 15:38:50

标签: sql-server sql-server-2008 common-table-expression

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)

但是我有什么可以做的,所以第二行也将包括在内吗?

P.S。 (除了将其保留为临时表)

1 个答案:

答案 0 :(得分:1)

一般情况下你不能。

它仅对下一个声明有效。如果要将定义重用于多个语句,或者将其实现为临时表/表变量,以重用结果,则可以定义具有相同定义的视图。 / p>

对于你问题中的具体情况,你可以在一个声明中完成所有这些。

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