У меня проблема с отслеживанием последовательности выполнения следующего кода:
Код работает нормально
Я просто пытаюсь понять, как.
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 на якорные и рекурсивные члены.
Запуск якорных членов, создающих первый вызов или базовый результат
набор (T0).
Запустите рекурсивный элемент (ы) с Ti в качестве входа и Ti + 1 в качестве выхода.
Повторяйте шаг 3, пока не будет возвращен пустой набор.
Вернуть набор результатов. Это СОЮЗ ВСЕХ от T0 до Tn.
Этапы:
1) строка 1 выполнена (x = привет)
2) строка 3 выполнена (привет)
3) теперь он называет себя так: здесь х снова вернулся к привету !! (строка 1)
в соответствии с: line 1 , всякий раз, когда cte вызывает себя - x всегда должен быть сброшен! (или T0 обходится в рекурсивном?)
Какую роль играет роль (x) в MyCTE (x)? вход или выход?
цитата:
Запустите рекурсивный элемент (ы) с Ti в качестве входа и Ti + 1 в качестве выхода.
Насколько мне известно (x) - это выходное значение, а не вход.