Share via


GetDescendant (moteur de base de données)

Retourne un nœud enfant du parent.

Syntaxe

-- Transact-SQL syntax
parent.GetDescendant ( child1 , child2 ) 

-- CLR syntax
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 ) 

Arguments

  • child1
    NULL ou le hierarchyid d'un enfant du nœud actuel.

  • child2
    NULL ou le hierarchyid d'un enfant du nœud actuel.

Types des valeurs de retour

**Type de retour SQL Server :**hierarchyid

Type de retour CLR : SqlHierarchyId

Notes

Retourne un nœud enfant qui est un descendant du parent.

  • Si le parent est NULL, retourne NULL.

  • Si parent n'est pas NULL et que enfant1 et enfant2 sont NULL, retourne un enfant du parent.

  • Si parent et enfant1 ne sont pas NULL et que enfant2 est NULL, retourne un enfant de parent supérieur à enfant1.

  • Si parent et enfant2 ne sont pas NULL et que enfant1 est NULL, retourne un enfant de parent inférieur à enfant2.

  • Si parent, enfant1 et enfant2 ne sont pas tous NULL, retourne un enfant de parent supérieur à enfant1 et inférieur à enfant2.

  • Si enfant1 n'est pas NULL et n'est pas un enfant du parent, une exception est levée.

  • Si enfant2 n'est pas NULL et n'est pas un enfant du parent, une exception est levée.

  • Si enfant1 >= enfant2, une exception est levée.

GetDescendant est déterministe. Par conséquent, si GetDescendant est appelée avec les mêmes entrées, elle produit toujours la même sortie. Toutefois, l'identité exacte de l'enfant produite peut varier en fonction de sa relation avec les autres nœuds, comme cela est indiqué dans l'exemple C.

Exemples

A. Insertion d'une ligne comme nœud le moins descendant

Un nouvel employé est embauché, dont le responsable est un employé existant au nœud /3/1/. Exécutez le code suivant pour insérer la nouvelle ligne en utilisant la méthode GetDescendant sans arguments pour spécifier le nouveau nœud de lignes comme /3/1/1/ :

DECLARE @Manager hierarchyid 
SELECT @Manager = CAST('/3/1/' AS hierarchyid)

INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)
VALUES
(@Manager.GetDescendant(NULL, NULL),
'adventure-works\FirstNewEmployee', 'Application Intern', '3/11/07') ;

B. Insertion d'une ligne comme nœud descendant supérieur

Un autre nouvel employé est embauché, avec le même responsable que dans l'exemple A. Exécutez le code suivant pour insérer la nouvelle ligne en utilisant la méthode GetDescendant à l'aide de l'argument child1 afin de spécifier que le nœud de la nouvelle ligne suit le nœud dans l'exemple A et devient /3/1/2/ :

DECLARE @Manager hierarchyid, @Child1 hierarchyid

SELECT @Manager = CAST('/3/1/' AS hierarchyid)
SELECT @Child1 = CAST('/3/1/1/' AS hierarchyid)

INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)
VALUES
(@Manager.GetDescendant(@Child1, NULL),
'adventure-works\SecondNewEmployee', 'Application Intern', '3/11/07') ;

C. Insertion d'une ligne entre deux nœuds existants

Un troisième employé est embauché, avec le même responsable que dans l'exemple A. Cet exemple insère la nouvelle ligne à un nœud supérieur au FirstNewEmployee de l'exemple A, et inférieur au SecondNewEmployee de l'exemple B. Exécutez le code suivant en utilisant la méthode GetDescendant. Utilisez l'argument child1 et l'argument child2 pour spécifier que le nœud de la nouvelle ligne devient le nœud /3/1/1.1/ :

DECLARE @Manager hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid

SELECT @Manager = CAST('/3/1/' AS hierarchyid)
SELECT @Child1 = CAST('/3/1/1/' AS hierarchyid)
SELECT @Child2 = CAST('/3/1/2/' AS hierarchyid)

INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate)
VALUES
(@Manager.GetDescendant(@Child1, @Child2),
'adventure-works\ThirdNewEmployee', 'Application Intern', '3/11/07') ;

Après l'exécution des exemples A, B, et C, les nœuds ajoutés à la table seront des homologues avec les valeurs hierarchyid suivantes :

/3/1/1/

/3/1/1.1/

/3/1/2/

Le nœud /3/1/1.1/ est supérieur à au nœud /3/1/1/ mais au même niveau dans la hiérarchie.

D. Exemples scalaires

SQL Server prend en charge l'insertion et la suppression arbitraires de tout nœud hierarchyid En utilisant GetDescendant(), il est toujours possible de générer un nœud entre deux nœuds hierarchyid quelconques. Exécutez le code suivant pour générer des exemples de nœuds à l'aide de GetDescendant :

DECLARE @h hierarchyid = hierarchyid::GetRoot()
DECLARE @c hierarchyid = @h.GetDescendant(NULL, NULL)
SELECT @c.ToString()
DECLARE @c2 hierarchyid = @h.GetDescendant(@c, NULL)
SELECT @c2.ToString()
SET @c2 = @h.GetDescendant(@c, @c2)
SELECT @c2.ToString()
SET @c = @h.GetDescendant(@c, @c2)
SELECT @c.ToString()
SET @c2 = @h.GetDescendant(@c, @c2)
SELECT @c2.ToString()

E. Exemple CLR

L'extrait de code suivant appelle la méthode GetDescendant() :

SqlHierarchyId parent, child1, child2;
parent = SqlHierarchyId.GetRoot();
child1 = parent.GetDescendant(SqlHierarchyId.Null, SqlHierarchyId.Null);
child2 = parent.GetDescendant(child1, SqlHierarchyId.Null);
Console.Write(parent.GetDescendant(child1, child2).ToString());