Як КТР працуе ўнутраны ў SQL Server?

У мяне паўсталі праблемы, каб адсочваць паслядоўнасць выканання наступнага кода:

<Моцны> Кодэкс працуе выдатна

Я проста спрабую зразумець, як.

    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 ў якарных і рэкурсіўных членаў.

     <Р> Запусціць элемент якара (ы) стварэнне першага выкліку або базавы вынік   мноства (Т0).      <Р> Выканаць рэкурсіўны карыстальнік (ёй) з Ti ў якасці ўваходнага сігналу і Ti + 1 у якасці выхаднога сігналу.      <Р> Паўтарыце крок 3 да пустога мноства вяртаецца.      <Р> Вяртае выніковы набор. Гэта UNION ALL Т0 Тп.

Этапы:

1) лінія 1 выконваецца (х = прывітанне)

2) радок 3 выконваецца (helloa)

3) зараз называе сябе так: тут х зноў вярнуцца да прывітанне !! (Лінія 1)

  • <р> па формуле: радок <моцны> 1 , калі КТР называе сябе - заўсёды варта скінуць х! (Ці ж Т0 абыходзіцца ў рэкурсыўнай?)

  • <р> якая роля (х) частцы яна MyCTE (х)? уваход або выхад?

<Моцны> цытата:

<Р> Выканаць рэкурсіўны карыстальнік (ёй) з Ti ў якасці ўваходнага сігналу і Ti + 1 у якасці выхаднога сігналу.

Наколькі мне вядома (х) з'яўляецца па-за значэнне, а не ўводу.

0
@gbn - Прывітанне! , Я бягу гэта ўжо і яго працу, але я не магу даведацца, як гэта зрабіць. - кожны раз, калі КТР называе сябе - х заўсёды павінны быць скінутыя , але яно не (гэта добра), але я не магу зразумець, чаму: ён кажа, што кожны раз, калі: абярыце х = нованавернутых ( VARCHAR (8000), 'прывітанне')
дададзена аўтар Royi Namir, крыніца
Ці з'яўляецца гэта тэарэтычны пытанне, ці вы запусціце гэта?
дададзена аўтар gbn, крыніца

1 адказы

T0/Line1 выконваецца адзін раз у якасці якара.

    <Літый> лінія 1 выканана (прывітанне) <Літый> радок 3 выконваецца (helloa), таму што LEN (прывітанне) = 5 менш, чым 100 <Літый> радок 3 выконваецца (helloaa), таму што LEN (helloa) = 6 менш, чым 100 <Літый> радок 3 выконваецца (helloaaa), таму што LEN (helloaa) = 7 менш, чым 100 <Літый> радок 3 выконваецца (helloaaaa), таму што LEN (helloaaa) = 8 менш, чым 100 <Літый> радок 3 выконваецца (helloaaaaa), таму што LEN (helloaaaa) = 9 менш, чым 100 <Літый> радок 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
дададзена
Як заўсёды - вы GREAT. дзякуй. праблема была ў тым, што я думаў, што радок 1 ЗАЎСЁДЫ атрымаць Выкананая ....
дададзена аўтар Royi Namir, крыніца
шлях за межы EXCELENT Адказ !!! Вялікае вам дзякуй.
дададзена аўтар Royi Namir, крыніца