Tsql 使用递归循环层次结构的T-SQL存储过程

Tsql 使用递归循环层次结构的T-SQL存储过程,tsql,stored-procedures,recursion,parent-child,hierarchy,Tsql,Stored Procedures,Recursion,Parent Child,Hierarchy,我有一个具体的问题 我的存储过程无法正常工作。。我将向您展示程序、数据库和参数: ALTER PROCEDURE [dbo].[ManufacturerParentToChild] @ServiceProviderId int, @CarmakerId int 作为 开始 您可以在上面看到我的存储过程 数据库表服务提供程序有7行: ServiceProviderId名称ParentServiceProviderId已删除 1“父项”空0 2'Child1'10 3'Child2'10 4'

我有一个具体的问题

我的存储过程无法正常工作。。我将向您展示程序、数据库和参数:

ALTER PROCEDURE [dbo].[ManufacturerParentToChild] 

@ServiceProviderId int,
@CarmakerId int
作为 开始

您可以在上面看到我的存储过程

数据库表服务提供程序有7行:

ServiceProviderId名称ParentServiceProviderId已删除
1“父项”空0
2'Child1'10
3'Child2'10
4'Child4'20
5'儿童5'3 0
6'儿童6'4 0
7'儿童7'6 0

参数获取以下值:

@ServiceProviderId=1 @自动识别码=5

该过程将ServiceProviderId 7、6、4和2插入到文件中,但不要插入3和5

有人知道为什么递归循环通过ServiceProviderId=2的子循环跳转而不通过ServiceProviderId=3的子循环跳转吗

谢谢你的帮助,很抱歉我的英语不好

如果你有问题可以问我

致意


Alex

while块中的fetch语句可能是原因。目前案文如下:

FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId;
尝试将其替换为:

FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId, @isDeleted;

使用
存在
选择计数(*)
检查是否存在。这样更有效。正如可能抛弃游标一样:-)对于SQL中的任何类型的递归,我强烈建议使用CTE(公共表表达式)。。。您还尝试在存储过程中进行过程编程,这很少是最优的…这很酷。如果它解决了您的问题,那么不要忘记将答案标记为已接受的答案。
FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId, @isDeleted;