Tôi đã viết một biểu thức CTE rất đơn giản để truy xuất danh sách tất cả các nhóm trong đó người dùng là thành viên.TSQL CTE: Cách tránh truyền tải ngang?
Quy tắc như thế này, người dùng có thể ở nhiều nhóm và nhóm có thể lồng nhau để nhóm có thể là thành viên của một nhóm khác, và hơn nữa, nhóm có thể là thành viên lẫn nhau của nhóm khác, vì vậy nhóm A là một thành viên của nhóm B và B cũng là một thành viên của Tập đoàn A.
CTE của tôi đi như thế này và rõ ràng nó mang lại đệ quy vô hạn:
;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
)
tôi không thể tìm thấy một giải pháp dễ dàng để back- theo dõi những nhóm mà tôi đã ghi lại.
Tôi đã nghĩ đến việc sử dụng tham số varchar bổ sung trong CTE để ghi lại danh sách tất cả các nhóm mà tôi đã truy cập, nhưng việc sử dụng varchar quá thô, phải không?
Có cách nào tốt hơn không?
Bạn có chắc là nó đang đệ quy vĩnh viễn không? Mặc định máy chủ là 100 lần lặp. Thử đọc gợi ý 'MAXRECURSION' trên [MSDN] (http://msdn.microsoft.com/en-us/library/ms175972.aspx). – Bridge
Đầu tiên lo lắng về hiệu quả, * sau đó * lo lắng về sự thô lỗ, nếu thời gian cho phép :) – AakashM
nó không recurse mãi mãi vì nó ném một lỗi sau 100 cuộc gọi đệ quy. Tha thứ từ ngữ của tôi. – Haoest