Share via


GetDescendant (Datenbankmodul)

Gibt einen untergeordnetetn 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 hierarchyid

CLR-Rückgabetyp: SqlHierarchyId 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 wird GetDescendant, wenn mit den gleichen Eingaben aufgerufen, immer die gleiche Ausgabe erzeugen. 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 
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. 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

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

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

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

/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. Skalare Beispiele

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