GetDescendant (Datenbank-Engine)
Gilt für: SQL Server Azure SQL-Datenbank Azure 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 )
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)