0

その上 while loopそしてCursors

n CTEテーブルを使用してブロック操作を行うにはどうすればよいですか?

例えば ​​:

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)

しかし、私にできることはありますか?2行目にも含まれますか?

ps(一時テーブルとして保持する以外に)

4

1 に答える 1

1

一般的にはできません。

次のステートメントでのみ有効です。複数のステートメントの定義を再利用する場合、または結果を再利用するために自分で一時テーブル/テーブル変数にマテリアライズする場合は、同じ定義でビューを定義できます。

ただし、質問の特定のケースでは、すべてを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 
于 2013-01-06T15:45:03.683 に答える