Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

CTE vòng lặp vô hạn với TÙY CHỌN (maxrecursion 0)

Nếu bạn đang đạt đến giới hạn đệ quy, bạn có thể có chiều sâu đáng kể trong các mối quan hệ bảo trợ hoặc một vòng lặp trong dữ liệu. Một truy vấn như sau sẽ phát hiện các vòng lặp và kết thúc đệ quy:

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. Cách kết nối Python với SQL Server để tự động hóa quy trình phụ trợ

  2. Phân biệt chữ hoa chữ thường Postgres

  3. Phương pháp hay nhất là chèn SQL Server nếu không tồn tại

  4. Cải thiện hiệu suất truy vấn SQL Server trên các bảng lớn

  5. Cách Chèn kết quả của một thủ tục đã lưu trữ vào một bảng tạm thời trong SQL Server