TSQL CTE: Wie vermeide ich das zirkuläre Überqueren?

Ich habe einen sehr einfachen CTE-Ausdruck geschrieben, der eine Liste aller Gruppen abruft, zu denen ein Benutzer gehört.

Die Regeln lauten wie folgt: Ein Benutzer kann mehreren Gruppen angehören, und Gruppen können verschachtelt sein, sodass eine Gruppe Mitglied einer anderen Gruppe sein kann. Außerdem können Gruppen Mitglied einer anderen Gruppe sein, sodass Gruppe A Mitglied der Gruppe ist B und Gruppe B ist auch Mitglied der Gruppe A.

Mein CTE geht so und es ergibt sich offensichtlich 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 keine einfache Lösung finden, um die bereits aufgezeichneten Gruppen zurück zu verfolgen.

Ich habe darüber nachgedacht, einen zusätzlichen varchar-Parameter im CTE zu verwenden, um eine Liste aller von mir besuchten Gruppen aufzuzeichnen, aber varchar ist einfach zu grob, nicht wahr?

Gibt es einen besseren Weg?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage