CTEはSQLの内部でどのように動作しますか?

次のコードを実行するシーケンスを追跡するのに問題があります。

コードは正常に動作しています

私はちょうど方法を理解しようとしている。

    with MyCTE(x)
    as
    (
  1)  select x = convert(varchar(8000),'hello')//line 1
    union all
  3)  select x + 'a' from MyCTE where len(x) < 100 //line 3
    )
    select x from MyCTE
    order by x

MSDN:

再帰的実行のセマンティクスは次のとおりです。

     

CTE式をアンカーメンバーと再帰メンバーに分割します。

     

アンカー・メンバーを実行して、最初の呼び出しまたは基本結果を作成する   set(T0)。

     

Tiを入力に、Ti + 1を出力として再帰メンバを実行します。

     

空のセットが返されるまでステップ3を繰り返します。

     

結果セットを返します。これはT0からTnまでのUNION ALLです。

段階:

1)行1が実行されます(x = hello)

2)行3が実行される(hello)

3)今それはそれ自身を呼んでいる:ここでxはもう一度こんにちは! ( ライン1)

    cteが自分自身を呼び出すときには、
  • に従って:line 1 - xは常にリセットされるべきです! (またはT0は再帰的にバイパスされますか?)

  • (x)の役割は何ですかMyCTE(x)ですか?入力または出力?

引用:

Tiを入力に、Ti + 1を出力として再帰メンバを実行します。

私の知る限り、(x)はアウトプット値であり、インプットではありません。

0
@gbn - こんにちは!私はこれをすでに実行していますが、どうやってそれを見つけるのか分かりません。 select x = convert()を選択すると、xは常にリセットされますが、 varchar(8000)、 'hello')
追加された 著者 Royi Namir,
これは理論的な質問か、これを実行しましたか?
追加された 著者 gbn,

1 答え

T0/Line1はアンカーとして1回実行されます。

  1. 1行目が実行されました(hello)
  2. LEN(hello)= 5以下、100未満のため、3行目が実行されます(hello)
  3. LEN(helloa)= 6未満、100未満のため、3行目が実行されます(helloaa)
  4. LEN(helloaa)= 7未満、100未満のため、3行目(helloaaa)が実行されます。
  5. LEN(helloaaa)= 8以下、100以下のため、3行目(helloaaaa)が実行されます。
  6. LEN(helloaaaa)= 9未満、100未満のため、3行目(helloaaaaa)が実行されます。
  7. LEN(helloaaaa)= 10未満、100未満であるため、3行目(helloaaaaaa)が実行されます。

...

いくつかのコメント

with MyCTE(x)
as
(
   select x = convert(varchar(8000),'hello')     -- Anchor, executed once
   union all
   select x + 'a' from MyCTE where len(x) < 100  -- Recursion, executed n times
)
select x from MyCTE order by x

実行時には、これは

   select x = convert(varchar(8000),'hello')     -- Anchor
   union all
   select 'hello' + 'a'         -- Recursion 1
   union all
   select 'helloa' + 'a'        -- Recursion 2
   union all
   select 'helloaa' + 'a'       -- Recursion 3
   union all
   select 'helloaaa' + 'a'      -- Recursion 4
   union all
   select 'helloaaaa' + 'a'     -- Recursion 5
   ...
4
追加された
いつものように - あなたは素晴らしいです。ありがとう。問題は、 1 行がいつも実行されると思ったということでした。
追加された 著者 Royi Namir,
eXcelent Answerを超えた方法!!!ありがとうございました。
追加された 著者 Royi Namir,