Sql 如何在无向循环图中对所有链接对象进行分组
我有一张桌子,上面有顾客和联合顾客。e、 g客户1有一个联合客户2。客户1也是客户3的联合客户 我正在尝试对链接的所有客户进行分组,并将相同的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
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是我认为可以实现的。顺便说一句,我的要求和这个问题相同