【问题标题】:T-SQL Stored Procedure for Looping a hierarchy with recursion使用递归循环层次结构的 T-SQL 存储过程
【发布时间】:2011-02-02 11:21:51
【问题描述】:

我有一个具体的问题。

我的存储过程不能正常工作。我将向你展示过程、数据库和参数:

ALTER PROCEDURE [dbo].[ManufacturerParentToChild] 

@ServiceProviderId int,
@CarmakerId int

作为 开始

SET NOCOUNT ON;

DECLARE @childSPPId int, @isDeleted bit

DECLARE ServiceProviderChildren_Cursor CURSOR FOR

SELECT ServiceProviderId, isDeleted
FROM ServiceProvider 
WHERE ParentServiceProviderId = @ServiceProviderId; 

OPEN ServiceProviderChildren_Cursor;

FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId, @isDeleted;

WHILE @@FETCH_STATUS = 0
   BEGIN
        IF @ServiceProviderId > 0
        BEGIN
            EXEC ManufacturerParentToChild @childSPPId, @CarmakerId;

            IF (SELECT COUNT(*) FROM dbo.CarmakerPartnership WHERE ServiceProviderId = @childSPPId AND CarmakerId = @CarmakerId) = 0
            BEGIN
                IF (@isDeleted = 0)
                BEGIN
                    INSERT INTO dbo.CarmakerPartnership (CarmakerId, ServiceProviderId, CreatedBy, ChangedBy, ValidityPeriodFrom, ValidityPeriodTo) VALUES (@CarmakerId, @childSPPId, SYSTEM_USER, SYSTEM_USER, '01.01.1900 00:00:00', '31.12.9999 23:59:00.000')
                END
            END 
        END
      FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId;
   END;
CLOSE ServiceProviderChildren_Cursor;
DEALLOCATE ServiceProviderChildren_Cursor; END

你看我上面的存储过程。

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

ServiceProviderId 名称 ParentServiceProviderId isDeleted
1 '父' 空 0
2 '儿童 1' 1 0
3 '儿童 2' 1 0
4 'Child4' 2 0
5 'Child5' 3 0
6 'child6' 4 0
7 '儿童 7' 6 0

参数获取值:

@ServiceProviderId = 1 @CarmakerId = 5

程序将 ServiceProviderId 7、6、4 和 2 插入 CarmakerPartnerShip,但不要插入 3 和 5!

有人知道为什么递归循环会跳过 ServiceProviderId = 2 的子代,但不跳过 ServiceProviderId = 3 的子代吗??

感谢您的帮助,对不起我的英语不好!

如果你有问题可以问我。

最好的问候

亚历克斯

【问题讨论】:

  • 使用EXISTS 而不是SELECT COUNT(*) 来检查是否存在。这样更有效率。可能会放弃光标:-)
  • 对于 SQL 中的任何类型的递归,我强烈建议您使用 CTE(公用表表达式)...您还尝试在存储过程中进行过程编程,这很少是最佳的。 ..

标签: tsql stored-procedures recursion parent-child hierarchy


【解决方案1】:

while 块中的 fetch 语句可能是原因。目前是这样写的:

FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId;

尝试将其替换为:

FETCH NEXT FROM ServiceProviderChildren_Cursor INTO @childSPPId, @isDeleted;

【讨论】:

  • 太酷了。如果它解决了您的问题,请不要忘记将答案标记为已接受的答案。
猜你喜欢
  • 2017-02-04
  • 2018-02-21
  • 1970-01-01
  • 2015-11-23
  • 2016-04-15
  • 2020-08-31
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多