CTE dahili olarak sql'de nasıl çalışır?

Aşağıdaki kodu yürütme Sırasını izlemek için bir sorun yaşıyorum:

Kurallar iyi çalışıyor

Sadece nasıl olduğunu anlamaya çalışıyorum.

    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:

Yinelemeli yürütmenin semantiği şöyledir:

     

CTE ifadesini çapa ve yinelemeli üyelere bölün.

     

İlk çağrıyı veya temel sonucu oluşturan bağlantı üyelerini/üyelerini çalıştırın.   set (T0).

     

Yinelemeli üyeleri/üyeleri bir giriş olarak Ti ve çıkış olarak Ti + 1 ile çalıştırın.

     

Boş bir set iade edilene kadar 3. adımı tekrarlayın.

     

Sonuç kümesini döndür. Bu, T0'dan Tn'ye TÜM BİR BÜTÜN.

Aşamaları:

1) satır 1 yürütülür (x = merhaba)

2) satır 3 yürütülür (helloa)

3) şimdi kendini çağırıyor: Burada x tekrar merhaba! ( satır 1)

  • satırına göre: 1 , cte her arandığında - x her zaman sıfırlanmalıdır! (veya T0, özyinelemede atlanır mı?)

  • (x) kısmının MyCTE (x) bölümündeki rolü nedir? giriş veya çıkış?

alıntı:

Yinelemeli üyeleri/üyeleri bir giriş olarak Ti ve çıkış olarak Ti + 1 ile çalıştırın.

Benim bilgime göre (x) Giriş değil, çıkış değeridir.

0
@gbn - Merhaba! Bunu zaten çalıştırıyorum ve nasıl çalıştığını anlayamıyorum. - cte her arandığında - x her zaman sıfırlanmalıdır , fakat o (bu iyi değil) ama neden bulamıyorum: her zaman diyor: select x = convert ( varchar (8000),) 'merhaba'
katma yazar Royi Namir, kaynak
Bu teorik bir soru mu, yoksa sen mi koştun?
katma yazar gbn, kaynak

1 cevap

T0/Line1 bir kere çapa olarak yürütülür.

  1. 1. satır yürütülür (merhaba)
  2. 3. satır yürütülür (merhaba) çünkü LEN (merhaba) = 5 daha az sonra 100
  3. 3. satır yürütülür (helloaa) çünkü LEN (merhaba) = 6 daha az sonra 100
  4. 3. satır yürütülür (helloaaa) çünkü LEN (merhabaaa) ​​= 7 daha az sonra 100
  5. 3. satır yürütülür (merhabaaaaa) çünkü LEN (merhabaaaa) = 8 daha az sonra 100
  6. 3. satır yürütülür (helloaaaaa) çünkü LEN (merhabaaaaa) = 9 daha az 100
  7. 3. satır yürütülür (merhabaaaaaaa) çünkü LEN (merhabaaaaa) = 10 daha az sonra 100

...

Bazı yorumlar ile

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

Çalışma zamanında, bu

   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
katma
Her zamanki gibi - sen büyüksün. Teşekkürler. Sorun şu ki 1 satırının DAİMA çalıştırıldığını düşündüm ....
katma yazar Royi Namir, kaynak
eXcelent Cevabının ötesine giden yol !!! Çok teşekkür ederim.
katma yazar Royi Namir, kaynak