Ich habe einen sehr einfachen CTE-Ausdruck geschrieben, der eine Liste aller Gruppen abruft, zu denen ein Benutzer gehört.TSQL CTE: Wie vermeidet man Kreisdurchlauf?
Die Regeln gehen so, ein Benutzer kann in mehreren Gruppen sein, und Gruppen können geschachtelt werden, so dass eine Gruppe ein Mitglied einer anderen Gruppe sein kann, und darüber hinaus Gruppen können gegenseitige Mitglied eines anderen sein, so Gruppe A ist ein Mitglied der Gruppe B und Gruppe B ist auch ein Mitglied der Gruppe A.
Mein CTE so geht und offensichtlich ergibt es eine unendliche Rekursion:
;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
)
ich kann nicht eine einfache Lösung finden Hinter- Verfolgen Sie die Gruppen, die ich bereits aufgenommen habe.
Ich dachte daran, einen zusätzlichen varchar-Parameter im CTE zu verwenden, um eine Liste aller Gruppen aufzuspeichern, die ich besucht habe, aber die Verwendung von varchar ist einfach zu grob, oder?
Gibt es einen besseren Weg?
Sind Sie sicher, dass es für immer rekursiv ist? Der Serverstandard ist 100 Iterationen. Versuchen Sie, den 'MAXRECURSION'-Hinweis auf [MSDN] (http://msdn.microsoft.com/en-us/library/ms175972.aspx) nachzulesen. – Bridge
Erste Sorge um die Wirksamkeit, * dann * Sorge um Grobheit, wenn die Zeit es erlaubt :) – AakashM
es nicht für immer rekursiv, weil es einen Fehler nach 100 rekursiven Aufrufe wirft. Verzeihen Sie meine Formulierung. – Haoest