Ho scritto un'espressione CTE molto semplice che recupera un elenco di tutti i gruppi di cui un utente è membro.TSQL CTE: come evitare l'attraversamento circolare?
Le regole sono le seguenti: un utente può trovarsi in più gruppi e i gruppi possono essere nidificati in modo che un gruppo possa essere membro di un altro gruppo e inoltre i gruppi possono essere membri reciproci di un altro, quindi il gruppo A è un membro della B Group e del Gruppo B è anche un membro del gruppo A.
mio CTE va come questa e, ovviamente, produce una ricorsione infinita:
;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
)
non riesco a trovare una soluzione facile per back- rintracciare quei gruppi che ho già registrato.
Stavo pensando di utilizzare un parametro varchar aggiuntivo nel CTE per registrare un elenco di tutti i gruppi che ho visitato, ma l'uso di varchar è troppo semplice, non è vero?
C'è un modo migliore?
Sei sicuro che ricorre per sempre? L'impostazione predefinita del server è 100 iterazioni. Prova a leggere l'hint 'MAXRECURSION' su [MSDN] (http://msdn.microsoft.com/en-us/library/ms175972.aspx). – Bridge
Prima preoccuparsi dell'efficacia, * quindi * preoccuparsi della crudezza, se il tempo lo consente :) – AakashM
non esegue recurse per sempre perché genera un errore dopo 100 chiamate ricorsive. Perdona la mia formulazione – Haoest