Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Nieskończona pętla CTE z OPCJA (maksymalna rekurencja 0)

Jeśli osiągasz limit rekurencji, albo masz znaczną głębokość w relacjach sponsorskich, albo masz pętlę w danych. Zapytanie podobne do poniższego wykryje pętle i zakończy rekurencję:

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. Wstaw zbiorczy programu SQL Server — część 1

  2. Wyświetl listę wszystkich baz danych z serwera połączonego w programie SQL Server (przykłady T-SQL)

  3. Wyświetl listę wszystkich kolumn dopuszczających wartość null w bazie danych programu SQL Server

  4. Podzapytanie używające Exists 1 lub Exists *

  5. Jak działa OBJECTPROPERTYEX() w SQL Server