Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

विकल्प के साथ अनंत लूप सीटीई (अधिकतम 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 सर्वर प्रबंधन स्टूडियो और Transact SQL में GO का क्या उपयोग है?

  2. SQL सर्वर में बाधाओं की जाँच करें

  3. SQL सर्वर में DENSE_RANK () कैसे काम करता है

  4. क्या SQL सर्वर एक्सप्रेस लोकलडीबी को दूरस्थ रूप से जोड़ा जा सकता है?

  5. अल्पविराम से अलग की गई स्ट्रिंग को अलग-अलग पंक्तियों में बदलना