私は、ユーザーがメンバーであるすべてのグループのリストを取得する非常に単純なCTE式を書いています。TSQL 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
)
私はバックする簡単な解決策を見つけることができません:グループBとグループBのメンバーも、私のCTEはこのようになり、明らかにそれは無限再帰をもたらし
グループAのメンバーでありますすでに録音したグループを追跡します。
私は訪問したすべてのグループのリストを記録するためにCTEに追加のvarcharパラメータを使用することを考えていましたが、varcharを使用するのはあまりにも粗すぎるのですか?
良い方法がありますか?
あなたは永遠に再帰していますか?サーバーのデフォルトは100回です。 [MSDN](http://msdn.microsoft.com/en-us/library/ms175972.aspx)の「MAXRECURSION」ヒントをお読みください。 – Bridge
最初に有効性について心配し、時間が許せば* crudnessについて心配してください:) – AakashM
100回の再帰呼び出しの後にエラーを投げるので永遠に再帰しません。私の言葉を許してください。 – Haoest