GetDescendant (motor de base de datos)GetDescendant (Database Engine)

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Devuelve el nodo secundario del nodo primario.Returns a child node of the parent.

SintaxisSyntax

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

ArgumentosArguments

child1child1
NULL o el hierarchyid de un nodo secundario del nodo actual.NULL or the hierarchyid of a child of the current node.

child2child2
NULL o el hierarchyid de un nodo secundario del nodo actual.NULL or the hierarchyid of a child of the current node.

Tipos devueltosReturn Types

Tipo de valor devuelto de SQL Server: hierarchyidSQL Server return type:hierarchyid

Tipo devuelto de CLR: SqlHierarchyIdCLR return type:SqlHierarchyId

NotasRemarks

Devuelve un nodo secundario que es un descendiente del nodo primario.Returns one child node that is a descendant of the parent.

  • Si el elemento primario es NULL, devolverá NULL.If parent is NULL, returns NULL.
  • Si el elemento primario no es NULL, y child1 y child2 son NULL, devuelve un elemento secundario del elemento primario.If parent is not NULL, and both child1 and child2 are NULL, returns a child of parent.
  • Si el elemento primario y child1 no son NULL y, a su vez, child2 es NULL, devuelve un elemento secundario del elemento primario mayor que child1.If parent and child1 are not NULL, and child2 is NULL, returns a child of parent greater than child1.
  • Si el elemento primario y child2 no son NULL y, a su vez, child1 es NULL, devuelve un elemento secundario del elemento primario menor que child2.If parent and child2 are not NULL and child1 is NULL, returns a child of parent less than child2.
  • Si el elemento primario, child1 y child2 no son NULL, devuelve un elemento secundario del elemento primario mayor que child1 y menor que child2.If parent, child1, and child2 are not NULL, returns a child of parent greater than child1 and less than child2.
  • Si child1 o child2 no son NULL y no son un elemento secundario del elemento primario, se producirá una excepción.If child1 is not NULL and not a child of parent, an exception is raised.
  • Si child2 no es NULL ni es un elemento secundario del elemento primario, se producirá una excepción.If child2 is not NULL and not a child of parent, an exception is raised.
  • Si child1 >= child2, se producirá una excepción.If child1 >= child2, an exception is raised.

GetDescendant es determinista.GetDescendant is deterministic. Por lo tanto, si se llama a GetDescendant con las mismas entradas, siempre producirá la misma salida.Therefore, if GetDescendant is called with the same inputs, it will always produce the same output. Sin embargo, la identidad exacta del nodo secundario producido puede variar en función de su relación con los demás nodos, como se muestra en el ejemplo C.However, the exact identity of the child produced can vary depending upon its relationship to the other nodes, as demonstrated in example C.

EjemplosExamples

A.A. Insertar una fila como el nodo menos descendienteInserting a row as the least descendant node

Se contrata a un nuevo empleado, que es subordinado de un empleado ya existente en el nodo /3/1/.A new employee is hired, reporting to an existing employee at node /3/1/. Ejecute el siguiente código para insertar la nueva fila usando el método GetDescendant sin argumentos para especificar el nodo de la nueva fila como /3/1/1/:Execute the following code to insert the new row by using the GetDescendant method without arguments to specify the new rows node as /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.B. Insertar una fila como un nodo más descendienteInserting a row as a greater descendant node

Se contrata a otro empleado nuevo, que es subordinado del mismo jefe que en el ejemplo A. Ejecute el siguiente código para insertar la fila nueva con el método GetDescendant, usando el argumento child1 para especificar que el nodo de la nueva fila vendrá después del nodo del ejemplo A, convirtiéndose en /3/1/2/:Another new employee is hired, reporting to the same manager as in example A. Execute the following code to insert the new row by using the GetDescendant method using the child 1 argument to specify that the node of the new row will follow the node in example A, becoming /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.C. Insertar una fila entre dos nodos existentesInserting a row between two existing nodes

Se contrata a un tercer empleado, subordinado del mismo jefe que en el ejemplo A. Este ejemplo inserta la nueva fila en un nodo mayor que el nodo FirstNewEmployee del ejemplo A y menor que el nodo SecondNewEmployee del ejemplo B. Ejecute el siguiente código con el método GetDescendant.A third employee is hired, reporting to the same manager as in example A. This example inserts the new row to a node greater than the FirstNewEmployee in example A, and less than the SecondNewEmployee in example B. Execute the following code by using the GetDescendant method. Use los argumentos child1 y child2 para especificar que el nodo de la nueva fila se convertirá en el nodo /3/1/1.1/:Use both the child1 argument and the child2 argument to specify that the node of the new row will become node /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') ;  
  

Después de completar los ejemplos A, B y C, los nodos agregados a la tabla estarán en el mismo nivel que los siguientes valores hierarchyid:After completing examples A, B, and C, the nodes added to the table will be peers with the following hierarchyid values:

/3/1/1/

/3/1/1.1/

/3/1/2/

El nodo /3/1/1.1/ es mayor que el nodo /3/1/1/, pero está en el mismo nivel de la jerarquía.Node /3/1/1.1/ is greater than node /3/1/1/ but at the same level in the hierarchy.

D.D. Ejemplos escalaresScalar examples

SQL ServerSQL Server admite inserciones y eliminaciones arbitrarias de cualquier nodo hierarchyid.supports arbitrary insertions and deletions of any hierarchyid nodes. Si usa GetDescendant(), siempre podrá generar un nodo entre dos nodos hierarchyid cualesquiera.By using GetDescendant(), it is always possible to generate a node between any two hierarchyid nodes. Ejecute el código siguiente para generar nodos de ejemplo mediante GetDescendant:Execute the following code to generate sample nodes using 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.E. Ejemplo de CLRCLR example

En el fragmento de código siguiente se llama al método GetDescendant():The following code snippet calls the GetDescendant() method:

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

Vea tambiénSee also

Referencia de los métodos del tipo de datos hierarchyidhierarchyid Data Type Method Reference
Datos jerárquicos (SQL Server)Hierarchical Data (SQL Server)
hierarchyid (Transact-SQL)hierarchyid (Transact-SQL)