我寫了一個非常簡單的CTE表達式,用於檢索用戶所屬的所有組的列表。TSQL 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提示(http://msdn.microsoft.com/zh-cn/library/ms175972.aspx)。 – Bridge
首先擔心功效,*然後*擔心粗糙,如果時間允許的話:) – AakashM
它不會永久遞歸,因爲它會在100次遞歸調用後引發錯誤。原諒我的措辭。 – Haoest