Procedimento armazenado T-SQL para fazer loop em uma hierarquia com recursão
Eu tenho uma pergunta específica.
Meu procedimento armazenado não funciona corretamente. Mostrarei o procedimento, o banco de dados e o parâmetro:
ALTER PROCEDURE [dbo].[ManufacturerParentToChild]
@ServiceProviderId int,
@CarmakerId int
COMO INICIAR
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
Você vê meu procedimento armazenado acima.
O provedor de serviços da tabela de banco de dados possui 7 linhas:
Nome do ServiceProviderId ParentServiceProviderId isDeleted
1 'Pai' Nulo 0
2 'Criança1' 1 0
3 'Criança2' 1 0
4 'Criança4' 2 0
5 'Criança5' 3 0
6 'criança6' 4 0
7 'Criança7' 6 0
O Paramater obtém os valores:
@ServiceProviderId = 1 @CarmakerId = 5
O procedimento insere o ServiceProviderId 7, 6, 4 e 2 no CarmakerPartnerShip, mas não insira 3 e 5!
Alguém tem uma idéia de por que o loop recursivo passa pelos filhos de ServiceProviderId = 2, mas não passa pelos filhos de ServiceProviderId = 3?
Obrigado pela sua ajuda e desculpe pelo meu mau inglês !!
Se você tiver perguntas, pode me perguntar.
Cumprimentos
Alex