GetDescendant (Motore di database)

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure

Restituisce il nodo figlio di un nodo padre.

Sintassi

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

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

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: hierarchyid

Tipo CLR restituito: SqlHierarchyId

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 viene chiamato con gli stessi input GetDescendant restituisce 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

R. 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 usando il metodo GetDescendant senza argomenti per specificare il nuovo nodo delle righe come /3/1/1/:

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. Inserimento di una riga come nodo discendente maggiore

Viene assunto un altro nuovo dipendente, che risponde allo stesso responsabile dell'esempio A. Eseguire il codice seguente per inserire la nuova riga mediante il metodo GetDescendant, usando 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;  
  
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. Inserimento di una riga tra due nodi esistenti

Viene assunto un terzo dipendente, che risponde allo stesso responsabile 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 usando 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;  
  
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') ;  
  

Dopo il completamento degli esempi A, B e C i nodi aggiunti alla tabella si troveranno allo stesso livello dei 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 eliminazioni e inserimenti arbitrari di qualsiasi nodo hierarchyid. Usando 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());  

Vedi anche

Guida di riferimento ai metodi per il tipo di dati hierarchyid
Dati gerarchici (SQL Server)
hierarchyid (Transact-SQL)