Я написал очень простое выражение CTE, которое извлекает список всех групп, членом которых является пользователь.
Правила выполняются следующим образом: пользователь может быть в нескольких группах, а группы могут быть вложены так, что группа может быть членом другой группы, и, кроме того, группы могут быть взаимными членами другого, поэтому группа A является член группы B и группа B также является членом группы A.
My 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
            )
Я не могу найти легкое решение для отслеживания тех групп, которые я уже записал.
Я думал об использовании дополнительного параметра varchar в CTE для записи списка всех групп, которые я посетил, но использование varchar слишком грубо, не так ли?
Есть ли лучший способ?