Share via


GetDescendant (Datenbank-Engine)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Gibt einen untergeordneten Knoten des übergeordneten Elements zurück.

Syntax

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

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 (12.x) und früher finden Sie unter Dokumentation zu früheren Versionen.

Argumente

child1
NULL oder die hierarchyid eines untergeordneten Elements des aktuellen Knotens.

child2
NULL oder die hierarchyid eines untergeordneten Elements des aktuellen Knotens.

Rückgabetypen

SQL Server-Rückgabetyp: hierarchyid

CLR-Rückgabetyp: SqlHierarchyId

Hinweise

Gibt einen untergeordneten Knoten zurück, der ein Nachfolger des übergeordneten Elements ist.

  • Ist parent NULL, wird NULL zurückgegeben.
  • Ist parent nicht NULL und sind sowohl child1 als auch child2 NULL, dann wird ein parent untergeordneter Knoten zurückgegeben.
  • Sind parent und child1 nicht NULL und ist child2 NULL, dann wird ein parent untergeordneter Knoten zurückgegeben, der größer als child1 ist.
  • Sind parent und child2 nicht NULL und ist child1 NULL, dann wird ein parent untergeordneter Knoten zurückgegeben, der kleiner als child2 ist.
  • Sind parent, child1 und child2 nicht NULL, dann wird ein untergeordneter Knoten zurückgegeben, der größer als child1 und kleiner als child2 ist.
  • Ist child1 nicht NULL und außerdem kein untergeordnetes Element von parent, wird eine Ausnahme ausgelöst.
  • Ist child2 nicht NULL und außerdem kein untergeordnetes Element von parent, wird eine Ausnahme ausgelöst.
  • Ist child1 >= child2, wird eine Ausnahme ausgelöst.

GetDescendant ist deterministisch. Deshalb erzeugt GetDescendant immer die gleiche Ausgabe, wenn es mit den gleichen Eingaben aufgerufen wird. Die genaue Identität des erzeugten untergeordneten Elements kann jedoch abhängig von seiner Beziehung zu den anderen Knoten variieren, wie in Beispiel C veranschaulicht wird.

Beispiele

A. Einfügen einer Zeile als unterster Nachfolgerknoten

Ein neuer Mitarbeiter wird eingestellt und berichtet einem vorhandenen Mitarbeiter auf Knoten /3/1/. Führen Sie den folgenden Code aus, um mithilfe der GetDescendant-Methode ohne Argumente eine neue Zeile einzufügen, um den Knoten der neuen Zeile auf /3/1/1/ festzulegen:

DECLARE @Manager hierarchyid;   
SET @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. Einfügen einer Zeile als höherer Nachfolgerknoten

Ein weiterer neuer Mitarbeiter wird eingestellt, der ebenfalls dem Abteilungsleiter aus Beispiel A berichtet. Führen Sie den folgenden Code aus, um mithilfe der GetDescendant-Methode eine neue Zeile einzufügen, wobei Sie mit dem child1-Argument festlegen, dass der Knoten der neuen Zeile auf den Knoten aus Beispiel A folgen soll und somit /3/1/2/ lautet:

DECLARE @Manager hierarchyid, @Child1 hierarchyid;  
  
SET @Manager = CAST('/3/1/' AS hierarchyid);  
SET @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. Einfügen einer Zeile zwischen zwei vorhandenen Knoten

Ein dritter neuer Mitarbeiter wird eingestellt, der ebenfalls dem Abteilungsleiter aus Beispiel A berichtet. In diesem Beispiel wird die neue Zeile mit einem Knoten eingefügt, der größer ist als FirstNewEmployee in Beispiel A und kleiner als SecondNewEmployee in Beispiel B. Führen Sie den folgenden Code mithilfe der GetDescendant-Methode aus. Verwenden Sie die Argumente child1 und child2, um festzulegen, dass der Knoten der neuen Zeile der Knoten /3/1/1.1/ sein wird:

DECLARE @Manager hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid;  
  
SET @Manager = CAST('/3/1/' AS hierarchyid);  
SET @Child1 = CAST('/3/1/1/' AS hierarchyid);  
SET @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') ;  
  

Nach Abschluss der Beispiele A, B und C sind die der Tabelle hinzugefügten Knoten Peers der folgenden hierarchyid-Werte:

/3/1/1/

/3/1/1.1/

/3/1/2/

Knoten /3/1/1.1/ ist größer als Knoten /3/1/1/, befindet sich aber auf der gleichen Ebene in der Hierarchie.

D. Skalarbeispiele

SQL Server unterstützt willkürliche Einfüge- und Löschvorgänge beliebiger hierarchyid-Knoten. Mit GetDescendant() ist es immer möglich, einen Knoten zwischen zwei beliebigen hierarchyid-Knoten zu generieren. Führen Sie den folgenden Code aus, um mithilfe von GetDescendant Beispielknoten zu generieren:

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. CLR-Beispiel

Im folgenden Codeausschnitt wird die GetDescendant()-Methode aufgerufen:

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());  

Weitere Informationen

hierarchyid-Datentyp-Methodenverweis
Hierarchische Daten (SQL Server)
hierarchyid (Transact-SQL)