Як 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 на якірні та рекурсивні елементи.

     

Запустіть прив'язку, яка створює перший виклик або базовий результат   

     

Запустіть рекурсивний член (и) з Ti як вхідний, а Ti + 1 - як вихід.

     

Повторіть крок 3, доки не буде повернуто порожній набір.

     

Повертає набір результатів. Це UNION ALL T0 до Tn.

Етапи:

1) виконується рядок 1 (x = hello)

2) виконується рядок 3 (helloa)

3) тепер він називає себе так: тут х знову повертається до привіт! (рядок 1)

  • відповідно до рядка 1 , коли виклик cte - x завжди має бути скинутий (або T0 обходиться в рекурсивному?)

  • Яка роль для (x) її частини MyCTE (x)? введення чи виведення?

Цитата:

Запустіть рекурсивний член (и) з Ti як вхідний, а Ti + 1 - як вихід.

Наскільки мені відомо, (x) є вихідним значенням, а не входом.

0
@ gbn - Привіт! , Я запускаю це вже та його робочий але я cant знаю як. - кожного разу, коли виклик cte сам - x завжди повинен бути скинутий , але він не працює (це нормально), але я не можу з'ясувати, чому: він каже щоразу: виберіть x = convert varchar (8000), "hello")
додано Автор Royi Namir, джерело
Чи є це теоретичне питання, або ви це виконуєте?
додано Автор gbn, джерело

1 Відповіді

T0/Line1 виконується один раз як прив'язка.

  1. виконується перший рядок (hello)
  2. виконується рядок 3 (helloa), оскільки LEN (hello) = 5 менше 100
  3. лінія 3 виконується (helloaa), оскільки LEN (helloa) = 6 менше 100
  4. виконується рядок 3 (helloaaa), оскільки LEN (helloaa) = 7 менше 100
  5. виконується рядок 3 (helloaaaa), оскільки LEN (helloaaa) = 8 менше 100
  6. виконується рядок 3 (helloaaaaa), оскільки LEN (helloaaaa) = 9 менше 100
  7. лінія 3 виконується (helloaaaaaa), оскільки LEN (helloaaaa) = 10 менше 100

...

З деякими коментарями

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 Відповідь !!! Велике спасибі.
додано Автор Royi Namir, джерело