Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

CTE безкраен цикъл с ОПЦИЯ (макс. рекурсия 0)

Ако достигате границата на рекурсия, имате или значителна дълбочина в спонсориращите взаимоотношения, или цикъл в данните. Заявка като следната ще открие цикли и ще прекрати рекурсията:

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 );



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите произволни редове от таблица на SQL Server - SQL Server / TSQL урок, част 117

  2. Вътрешни елементи на SQL Server:Проблемни оператори Pt. II – Хеширане

  3. Как да настроите Spotlight Cloud и ефективно да отстраните неизправности на SQL сървър

  4. Как да променя езика по подразбиране за SQL Server?

  5. Как да задам променлива от SQL заявка?