GetDescendant (Mecanismo de Banco de Dados)
Retorna um nó filho do pai.
Sintaxe
-- Transact-SQL syntax
parent.GetDescendant ( child1 , child2 )
-- CLR syntax
SqlHierarchyId GetDescendant ( SqlHierarchyId child1 , SqlHierarchyId child2 )
Argumentos
child1
NULL ou o hierarchyid de um filho do nó atual.child2
NULL ou o hierarchyid de um filho do nó atual.
Tipos de retorno
Tipo de retorno do SQL Server: hierarchyid
Tipo de retorno CLR: SqlHierarchyId
Comentários
Retorna um nó filho que é um descendente do pai.
Se o pai for o NULL, retornará NULL.
Se o pai não for NULL, e child1 e child2 forem NULL, retornará um filho do pai.
Se o pai e child1 não forem NULL e child2 for NULL, retornará um filho do pai maior que child1.
Se o pai e child2 não forem NULL e child1 for NULL, retornará um filho do pai menor que child2.
Se parent, child1 e child2 não forem NULL, retornará um filho do pai maior que child1 e menor que child2.
Se child1 não for NULL e não for um filho de pai, ocorrerá uma exceção.
Se child2 não for NULL e não for um filho de pai, ocorrerá uma exceção.
Se child1 >= child2, ocorrerá uma exceção.
GetDescendant é determinístico. Portanto, se GetDescendant for chamado com as mesmas entradas, sempre produzirá a mesma saída. Contudo, a identidade exata do filho produzida pode variar de acordo com sua relação com os outros nós, como mostrado no exemplo C.
Exemplos
A.Inserindo uma linha como o nó menos descendente
Um funcionário novo é contratado, subordinado a um funcionário existente no nó /3/1/. Execute o código a seguir para inserir a nova linha usando o método GetDescendant sem argumentos para especificar o nó das novas linhas como /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.Inserindo uma linha como um nó mais descendente
Outro novo funcionário é contratado, reportando ao mesmo gerente como no exemplo A. Execute o código a seguir para inserir a nova linha com o método GetDescendant com o uso do argumento child 1 para especificar que o nó da nova linha virá depois do nó do exemplo A, tornando-se /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.Inserindo uma linha entre dois nós existentes
Um terceiro funcionário é contratado, reportando ao mesmo gerente como no exemplo A. Este exemplo insere a nova linha em um nó maior que o FirstNewEmployee do exemplo A, e menor que o SecondNewEmployee do exemplo B. Execute o código a seguir por meio do método GetDescendant. Use tanto o argumento child1 como child2 para especificar que o nó da nova linha será o nó /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') ;
Depois de concluir os exemplos A, B e C, os nós adicionados à tabela serão computadores par com os seguintes valores de hierarchyid:
/3/1/1/
/3/1/1.1/
/3/1/2/
O nó /3/1/1.1/ é maior que o nó /3/1/1/, mas está no mesmo nível na hierarquia.
D.Exemplos de escalar
SQL Server dá suporte a inserções e exclusões arbitrárias de qualquer nó hierarchyid. Com o uso de GetDescendant(), sempre é possível gerar um nó entre quaisquer dois nós hierarchyid. Execute o código a seguir para gerar nós de exemplo com o uso de 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.Exemplo de CLR
O trecho de código a seguir chama o método 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());