9

大きなレコードを含む CTE クエリがあります。以前は正常に動作していました。しかし最近、一部のメンバーでエラーがスローされます

声明は終了しました。ステートメントが完了する前に、最大再帰回数 100 を使い果たしました。

レコードを制限したくないので、クエリにOPTION (maxrecursion 0)orを付けます。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 に感謝)

この方法を試してみましたが、うまくいきます。自己参照テーブルを解析するときの CTE の無限ループ

4

1 に答える 1

10

If you are hitting the recursion limit, you either have considerable depth in sponsoring relationships or a loop in the data. A query like the following will detect loops and terminate the recursion:

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 );
于 2013-02-26T04:28:45.160 に答える