TSQL CTE: Jak uniknąć przechodzenia cyklicznego?

Napisałem bardzo proste wyrażenie CTE, które pobiera listę wszystkich grup, których członkiem jest użytkownik.

Zasady są następujące: użytkownik może być w wielu grupach, a grupy mogą być zagnieżdżone, tak aby grupa mogła być członkiem innej grupy, a ponadto grupy mogą być wspólnymi członkami innej grupy, więc grupa A jest członkiem grupy B i grupa B jest również członkiem grupy A.

Mój CTE idzie tak i oczywiście daje nieskończoną rekursję:

            ;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
            )

Nie mogę znaleźć łatwego rozwiązania do śledzenia grup, które już nagrałem.

Myślałem o użyciu dodatkowego parametru varchar w CTE, aby zapisać listę wszystkich grup, które odwiedziłem, ale używanie varchar jest po prostu zbyt prymitywne, prawda?

Czy jest lepszy sposób?

questionAnswers(2)

yourAnswerToTheQuestion