GetDescendant (Motore di database)

Restituisce il nodo figlio di un nodo padre.

Sintassi

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

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

Argomenti

  • child1
    NULL o il valore hierarchyid di un figlio del nodo corrente.

  • child2
    NULL o il valore hierarchyid di un figlio del nodo corrente.

Tipi restituiti

Tipo SQL Server restituito:hierarchyidhierarchyid

Tipo CLR restituito:SqlHierarchyIdSqlHierarchyId

Osservazioni

Restituisce un nodo figlio discendente del padre.

  • Se il padre è Null, restituisce Null.

  • Se il padre è diverso da Null e child1 e child2 sono Null, restituisce un figlio del padre.

  • Se il padre e child1 sono diversi da Null e child2 è NULL, restituisce un figlio del padre maggiore di child1.

  • Se il padre e child2 sono diversi da Null e child1 è Null, restituisce un figlio del padre minore di child2.

  • Se il padre, child1 e child2 sono diversi da Null, restituisce un figlio del padre maggiore di child1 e minore di child2.

  • Se child1 è diverso da Null, ma non è un figlio del padre, viene generata un'eccezione.

  • Se child2 è diverso da Null, ma non è un figlio del padre, viene generata un'eccezione.

  • Se child1 >= child2, viene generata un'eccezione.

GetDescendant è deterministico. Pertanto, se GetDescendant viene chiamato con gli stessi input, restituirà sempre lo stesso output. L'identità esatta del figlio restituito può tuttavia variare in base alla relazione con gli altri nodi, come dimostrato nell'esempio C.

Esempi

A. Inserimento di una riga come ultimo nodo discendente

Viene assunto un nuovo dipendente, messo in relazione con un dipendente esistente nel nodo /3/1/. Eseguire il codice seguente per inserire la nuova riga utilizzando il metodo GetDescendant senza argomenti per specificare il nuovo nodo delle righe come /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. Inserimento di una riga come nodo discendente maggiore

Viene assunto un altro nuovo dipendente, messo in relazione con lo stesso dirigente dell'esempio A. Eseguire il codice seguente per inserire la nuova riga mediante il metodo GetDescendant utilizzando l'argomento child1 per specificare che il nodo della nuova riga seguirà il nodo dell'esempio A, divenendo /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. Inserimento di una riga tra due nodi esistenti

Viene assunto un terzo dipendente, messo in relazione con lo stesso dirigente dell'esempio A. In questo esempio viene inserita la nuova riga in un nodo maggiore di FirstNewEmployee dell'esempio A e minore di SecondNewEmployee nell'esempio B. Eseguire il codice seguente utilizzando il metodo GetDescendant. Utilizzare sia l'argomento child1 che l'argomento child2 per specificare che il nodo della nuova riga diventerà il nodo /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') ;

Dopo avere completato gli esempi A, B e C, i nodi aggiunti alla tabella si troveranno allo stesso livello con i valori hierarchyid seguenti:

/3/1/1/

/3/1/1.1/

/3/1/2/

Il nodo /3/1/1.1/ è maggiore del nodo /3/1/1/, ma si trova allo stesso livello della gerarchia.

D. Esempi scalari

SQL Server supporta inserimenti ed eliminazioni arbitrari di qualsiasi nodo hierarchyid. Utilizzando GetDescendant(), è sempre possibile generare un nodo tra due nodi hierarchyid qualsiasi. Eseguire il codice seguente per generare nodi di esempio utilizzando 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. Esempio CLR

Nel frammento di codice seguente viene chiamato il metodo 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());