我有CTE查询,其上有大量记录。以前它工作得很好。但是最近,它会因一些成员带OPTION的无限循环CTE(maxrecursion 0)
终止该语句错误。报表完成前,最大递归100已用尽。
所以我把OPTION (maxrecursion 0)
或OPTION (maxrecursion 32767)
我的查询,因为我不希望限制的记录。但是,结果是查询需要永久加载。我该如何解决这个问题?
这里是我的代码:
with cte as(
-- Anchor member definition
SELECT e.SponsorMemberID , e.MemberID, 1 AS Level
FROM tblMember AS e
where e.memberid = @MemberID
union all
-- Recursive member definition
select child.SponsorMemberID , child.MemberID, Level + 1
from tblMember child
join cte parent
on parent.MemberID = child.SponsorMemberID
)
-- Select the CTE result
Select distinct a.*
from cte a
option (maxrecursion 0)
编辑:删除不必要的代码,很容易理解
解决:所以问题不是来自maxrecursion
。它来自CTE。我不知道为什么,但可能它包含任何赞助商周期:A - > B - > C - > A - > ...(感谢@HABO)
我试过这种方法,它的工作原理。 Infinite loop in CTE when parsing self-referencing table
您确定该数据不包含任何发起人循环:A - > B - > C - > A - > ...?还是自发赞助的会员? – HABO 2013-02-26 04:06:20
你检查了查询计划吗?你有没有试图消除你的每个联接,首先检查cte,然后分别检查HigRank,gt,TotCust? – cha 2013-02-26 04:10:00
HABO:不,tblMember上的成员具有唯一的值 cha:我认为查询工作正常。它工作,如果成员有一个小记录 – vantian 2013-02-26 04:20:34