【发布时间】:2011-10-28 16:58:41
【问题描述】:
我在跟踪以下代码的执行顺序时遇到问题:
代码运行良好
我只是想了解如何。
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 的 UNION ALL。
阶段:
1) 执行第 1 行 (x=hello)
2) 执行第 3 行 (helloa)
3) 现在它这样称呼自己:这里 x 又回到了你好! (第 1 行)
根据:1 行,每当 cte 调用自身时,x 总是应该被重置! (还是在递归中绕过了T0?)
MyCTE(x) 中 (x) 部分的作用是什么?输入还是输出?
引用:
以 Ti 作为输入,Ti+1 作为输出运行递归成员。
据我所知,(x) 是输出值,而不是输入值。
【问题讨论】:
-
这是一个理论问题,还是你运行过这个?
-
@gbn - 嗨! ,我已经运行它并且它的工作,但我不知道如何。 -
whenever the cte calls itself - the x is always should be reset,但它没有(这很好)但我不知道为什么:它每次都说:select x = convert(varchar(8000),'hello')
标签: sql-server common-table-expression