gpt4 book ai didi

sql-server - 带选项的无限循环 CTE(最大递归 0)

转载 作者:行者123 更新时间:2023-12-02 16:05:22 24 4
gpt4 key购买 nike

我有一个包含大量记录的 CTE 查询。以前它工作得很好。但最近,它对某些成员抛出错误

The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

因此,我在查询中添加了 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

最佳答案

如果您达到了递归限制,则说明您在赞助关系方面具有相当的深度,或者在数据中存在循环。像下面这样的查询将检测循环并终止递归:

declare @tblMember as Table ( MemberId Int, SponsorMemberId Int );
insert into @tblMember ( MemberId, SponsorMemberId ) values
( 1, 2 ), ( 2, 3 ), ( 3, 5 ), ( 4, 5 ), ( 5, 1 ), ( 3, 3 );
declare @MemberId as Int = 3;
declare @False as Bit = 0, @True as Bit = 1;

with Children as (
select MemberId, SponsorMemberId,
Convert( VarChar(4096), '>' + Convert( VarChar(10), MemberId ) + '>' ) as Path, @False as Loop
from @tblMember
where MemberId = @MemberId
union all
select Child.MemberId, Child.SponsorMemberId,
Convert( VarChar(4096), Path + Convert( VarChar(10), Child.MemberId ) + '>' ),
case when CharIndex( '>' + Convert( VarChar(10), Child.MemberId ) + '>', Path ) = 0 then @False else @True end
from @tblMember as Child inner join
Children as Parent on Parent.MemberId = Child.SponsorMemberId
where Parent.Loop = 0 )
select *
from Children
option ( MaxRecursion 0 );

关于sql-server - 带选项的无限循环 CTE(最大递归 0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15080922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com