【发布时间】:2012-06-14 21:45:04
【问题描述】:
我编写了一个非常简单的 CTE 表达式,它检索用户所属的所有组的列表。
规则是这样的,一个用户可以在多个组中,组可以嵌套,一个组可以是另一个组的成员,而且组可以是另一个组的成员,所以组 A 是一个B组成员,B组也是A组成员。
我的 CTE 是这样的,显然它会产生无限递归:
;WITH GetMembershipInfo(entityId) AS( -- entity can be a user or group
SELECT k.ID as entityId FROM entities k WHERE k.id = @userId
UNION ALL
SELECT k.id FROM entities k
JOIN Xrelationships kc on kc.entityId = k.entityId
JOIN GetMembershipInfo m on m.entityId = kc.ChildID
)
我找不到一个简单的解决方案来回溯我已经录制的那些组。
我正在考虑在 CTE 中使用一个额外的 varchar 参数来记录我访问过的所有组的列表,但是使用 varchar 太粗糙了,不是吗?
有没有更好的办法?
【问题讨论】:
-
你确定它是永远递归的吗?服务器默认值为 100 次迭代。尝试阅读MSDN 上的
MAXRECURSION提示。 -
先担心功效,然后担心粗糙,如果时间允许的话:)
-
它不会永远递归,因为它会在 100 次递归调用后引发错误。原谅我的措辞。
标签: tsql common-table-expression