Sql 如何在无向循环图中对所有链接对象进行分组

Sql 如何在无向循环图中对所有链接对象进行分组,sql,sql-server,Sql,Sql Server,我有一张桌子,上面有顾客和联合顾客。e、 g客户1有一个联合客户2。客户1也是客户3的联合客户 我正在尝试对链接的所有客户进行分组,并将相同的GroupCustNo分配给他们。在下表中,表1-2是链接的,表3-1是链接的。所以2-3也有联系。因此,下表中从1到8的所有客户都相互链接,并将拥有相同的GroupCustNo tbl_集团客户: CustNo JtCustNo GroupCustNo --- ------- ------ 1 2

我有一张桌子,上面有顾客和联合顾客。e、 g客户1有一个联合客户2。客户1也是客户3的联合客户

我正在尝试对链接的所有客户进行分组,并将相同的
GroupCustNo
分配给他们。在下表中,表1-2是链接的,表3-1是链接的。所以2-3也有联系。因此,下表中从1到8的所有客户都相互链接,并将拥有相同的
GroupCustNo

tbl_集团客户

CustNo   JtCustNo  GroupCustNo    
---      -------     ------   
1           2          null
2           null       null
3           1          null
4           1          null
4           5          null
5           6          null
5           7          null
6           null       null
7           null       null
8           5          null
下面是我编写的递归存储过程。我在while循环中为每个CustNo调用此函数:

exec usp_UpdateGroupCustomerNo 1, 1
存储过程对大多数客户都成功运行,但出现问题

已达到32的递归限制

某些客户的错误。这些客户有许多共同客户,也是其他客户的共同客户

递归在这里似乎不起作用,我不知道如何继续。请让我知道是否有任何替代方法来解决这个问题

CREATE PROCEDURE [dbo].[usp_UpdateGroupCustomerNo]
    @MainCustNo int, @GrpNo int
AS 
    declare @JtCustNo int; declare @MainCustNo2 int;

    if exists(select 1 from tbl_GroupCustomer 
              where CustNo = @MainCustNo and groupcustomernumber is null)
    begin    
        update tbl_GroupCustomer 
        set groupcustomernumber = @grpno 
        where CustNo = @MainCustNo 
          and groupcustomernumber is null

        DECLARE db_cursor CURSOR LOCAL FOR  
             select JtCustNo 
             from tbl_GroupCustomer 
             where CustNo = @MainCustNo and JtCustNo is not null

        OPEN db_cursor   

        FETCH NEXT FROM db_cursor INTO @JtCustNo   

        WHILE @@FETCH_STATUS = 0   
        BEGIN   
            select @JtCustNo as JtCustNo      

            exec usp_UpdateGroupCustomerNo @JtCustNo, @GrpNo

            DECLARE db_cursor2 CURSOR LOCAL FOR  
                select CustNo 
                from tbl_GroupCustomer 
                where JtCustNo = @JtCustNo 
                  and groupcustomernumber is null

            OPEN db_cursor2

            FETCH NEXT FROM db_cursor2 INTO @MainCustNo2   

            WHILE @@FETCH_STATUS = 0   
            BEGIN   
                if exists(select 1 from tbl_GroupCustomer 
                          where CustNo = @MainCustNo2 
                            and groupcustomernumber is null)
                begin     
                    exec usp_UpdateGroupCustomerNo @MainCustNo2, @GrpNo
                end

                FETCH NEXT FROM db_cursor INTO @MainCustNo2   
            END   

            CLOSE db_cursor2   
            DEALLOCATE db_cursor2

            FETCH NEXT FROM db_cursor INTO @JtCustNo   
    END  

    CLOSE db_cursor   
    DEALLOCATE db_cursor
END

您正在递归调用存储过程。因此,你叫它太多次了。@Gordon我知道,但在这种情况下,我怎么才能得到想要的结果呢。我可以采取任何不同的方法吗?一种卑鄙的方法是将递归级别传递给SP,如果达到限制,则退出w/o操作,然后运行您的SP尽可能多地更新所有数据。但我会在查询中寻找一种方法来实现这一点,而不是SP.@ajeh Yes recursive CTE是我认为可以实现的。顺便说一句,我的要求与在这个问题中递归调用存储过程的要求相同。因此,你叫它太多次了。@Gordon我知道,但在这种情况下,我怎么才能得到想要的结果呢。我可以采取任何不同的方法吗?一种卑鄙的方法是将递归级别传递给SP,如果达到限制,则退出w/o操作,然后运行您的SP尽可能多地更新所有数据。但我会在查询中寻找一种方法来实现这一点,而不是SP.@ajeh Yes recursive CTE是我认为可以实现的。顺便说一句,我的要求和这个问题相同