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: 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 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 responsabile dell'esempio A. Eseguire il codice riportato di seguito 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, diventando /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 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 riportato di seguito 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 eliminazioni e inserimenti 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());
Vedere anche
Riferimento
Concetti
Guida di riferimento ai metodi per il tipo di dati hierarchyid