Compartir vía


Ejemplo: recuperación de información de los empleados

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

En este ejemplo, se recupera el identificador y el nombre de cada empleado. En la base de datos AdventureWorks2022 , el identificador de empleado se puede obtener de la columna BusinessEntityID de la tabla Employee. Los nombres de los empleados se pueden obtener de la tabla Person. Para combinar las tablas, se puede usar la columna BusinessEntityID.

Supongamos que desea que la transformación FOR XML EXPLICIT genere XML como se muestra en el siguiente ejemplo:

<Employee EmpID="1" >
  <Name FName="Ken" LName="Sánchez" />
</Employee>
...

Dado que hay dos niveles en la jerarquía, habría que escribir dos consultas SELECT y aplicar UNION ALL. Esta es la primera consulta, que recupera los valores correspondientes al elemento <Employee> y sus atributos. La consulta asigna 1 como valor Tag para el elemento <Employee> y NULL como Parent, puesto que se trata del elemento de nivel superior.

SELECT 1    as Tag,
       NULL as Parent,
       E.BusinessEntityID AS [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID;

Esta es la segunda consulta. Recupera los valores correspondientes al elemento <Name>. Asigna 2 como valor de Tag para el elemento <Name> y como valor de etiqueta en 1 como valor de etiqueta Parent que identifica <Employee> como elemento primario.

SELECT 2 as Tag,
       1 as Parent,
       E.BusinessEntityID,
       FirstName,
       LastName
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID;

Combina estas consultas con UNION ALL, aplica FOR XML EXPLICITy especifica la cláusula ORDER BY querida. El conjunto de filas se debe ordenar primero según el valor de BusinessEntityID y, a continuación, por nombre, de modo que los valores NULL en el nombre aparezcan al principio. Si ejecuta la siguiente consulta sin la cláusula FOR XML, podrá ver la tabla universal generada.

Esta es la consulta final:

SELECT 1    as Tag,
       NULL as Parent,
       E.BusinessEntityID as [Employee!1!EmpID],
       NULL       as [Name!2!FName],
       NULL       as [Name!2!LName]
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID
UNION ALL
SELECT 2 as Tag,
       1 as Parent,
       E.BusinessEntityID,
       FirstName,
       LastName
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityID = P.BusinessEntityID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT;

Éste es el resultado parcial:

<Employee EmpID="1">
  <Name FName="Ken" LName="Sánchez" />
</Employee>
<Employee EmpID="2">
  <Name FName="Terri" LName="Duffy" />
</Employee>
...

El primer SELECT especifica los nombres para las columnas del conjunto de filas resultante. Estos nombres forman dos grupos de columnas. El grupo con el valor Tag de 1 en el nombre de columna identifica Employee como elemento y EmpID como atributo. El otro grupo de columnas tiene el valor Tag de 2 en la columna e identifica <Name> como elemento, y FName y LName como atributos.

La siguiente tabla muestra el conjunto de filas parcial generado por la consulta:

Etiqueta Parent Employee!1!EmpID Name!2!FName Name!2!LName
1 NULL 1 NULL NULL
2 1 1 Ken Sánchez
1 NULL 2 NULL NULL
2 1 2 Terri Duffy
1 NULL 3 NULL NULL
2 1 3 Roberto Tamburello
... ... ... ... ...

Así es como se procesan las filas de la tabla universal para crear el árbol XML resultante:

La primera fila identifica el valor Tag en 1. Por consiguiente, se identifica el grupo de columnas que tiene el valor Tag en 1 , Employee!1!EmpID. Esta columna identifica Employee como nombre de elemento. A continuación, se crea un elemento <Employee> que tenga atributos EmpID. Los valores de columna correspondientes se asignan a estos atributos.

La segunda fila tiene en Tag en valor 2. Por consiguiente, el grupo de columnas que tiene el valor Tag en 2 en el nombre de columna, Name!2!FName, se identifica: Name!2!LName. Estos nombres de columna identifican Name como nombre de elemento. Se crea un elemento <Name> con atributos FName y LName. A continuación, se asignan los valores de columna correspondientes a estos atributos. Esta fila identifica 1 como Parent. Este elemento secundario se agrega al elemento <Employee> anterior.

Este proceso se repite con el resto de filas del conjunto. Observe la importancia de ordenar las filas de la tabla universal para que FOR XML EXPLICIT pueda procesar el conjunto de filas por orden y generar el XML deseado.

Consulte también