2009-02-12 12 views
0

J'essaie d'apprendre SQL avancé et comment utiliser les requêtes système (serveur SQL). La requête ci-dessous est un peu confuse.Confondu comment cette requête fonctionne

CREATE PROC dbo.ShowHierarchy 
(
    @Root int 
) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE @EmpID int, @EmpName varchar(30) 

    SET @EmpName = (SELECT EmpName FROM dbo.Emp WHERE EmpID = @Root) 
    PRINT REPLICATE('-', @@NESTLEVEL * 4) + @EmpName 

    SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root) 

    WHILE @EmpID IS NOT NULL 
    BEGIN 
     EXEC dbo.ShowHierarchy @EmpID 
     SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID) 
    END 
END 
GO 

glanées ici:

http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm

Chaque fois que la requête est exécutée, comment est le paramètre @EmpId incrémenté? Est-ce que ça se fait? Aussi, le @root s'incrémente-t-il à chaque récursion? Par exemple. Chef de la direction est root, allez à subordonné immédiat, que subordonné immédiat est maintenant @root, etc.

Merci

Répondre

5

Chaque fois que la requête est exécutée, comment est le paramètre @EmpId incrémenté? Est-ce que ça se fait?

Celui-ci:

SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID) 

sélectionne EmpID minimale qui est supérieure à celle déjà sélectionnée, et l'affecte à la @EmpID.

Bien sûr, s'il y en a, le nouveau @EmpID sera supérieur à l'ancien, ce qui signifie que @EmpID est incrémenté.

+0

Vous me battez de quelques secondes. ;-) – Thorsten

3

Dans la dernière sélection, @EmpID est défini sur le plus faible EmpID qui est plus grand que @EmpID. De cette façon, @EmpID est "incrémenté" jusqu'à ce qu'il n'y ait plus d'EmpID plus grand. Dans ce cas, select min (EmpID) renvoie une valeur nulle et la boucle while se termine.

@Root est modifié via l'appel récursif à ShowHierarchy dans l'instruction EXEC. Fondamentalement, le @EmpID actuel devient le nouveau @Root dans l'exécution qui est déclenchée.

1

Comme le dit Quassnoi, c'est là @EmpId get incrémentée:

SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID) 

Et oui, quand la procédure est appelée récursive, il passe le @EmpID pour la récursion actuelle comme nouvelle @Root:

EXEC dbo.ShowHierarchy @EmpID 
Questions connexes