【发布时间】: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