FOR XML (SQL Server)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Una consulta SELECT devuelve los resultados como un conjunto de filas. Opcionalmente, se pueden recuperar resultados formales de una consulta SQL como XML especificando la cláusula FOR XML en la consulta. La cláusula FOR XML puede usarse en consultas de nivel superior y en subconsultas. La cláusula FOR XML de nivel superior solo puede usarse en la instrucción SELECT. En el caso de las subconsultas, FOR XML puede usarse en las instrucciones INSERT, UPDATE y DELETE. FOR XML también puede usarse en instrucciones de asignación.

En una cláusula FOR XML se especifica uno de estos modos:

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

El modo RAW genera un único elemento <row> por cada fila del conjunto de filas devuelto por la instrucción SELECT. Para generar una jerarquía XML se pueden escribir consultas FOR XML anidadas.

El modo AUTO genera anidamiento en el XML resultante utilizando heurística basada en la forma en que se especifica la instrucción SELECT. El control sobre la forma del XML generado es mínimo. Es posible escribir consultas FOR XML anidadas para generar una jerarquía XML más allá de la forma del XML generado mediante la heurística del modo AUTO.

El modo EXPLICIT concede un mayor control de la forma del XML. Es posible mezclar atributos y elementos con total libertad para decidir la forma del XML. Requiere un formato específico para el conjunto de filas resultante generado debido a la ejecución de la consulta. Después, el formato del conjunto de filas se asigna a una forma de XML. La eficacia del modo EXPLICIT reside en que se pueden mezclar atributos y elementos con total libertad, crear contenedores y propiedades complejas anidadas, crear valores separados por espacios (por ejemplo, el atributo OrderID puede tener una lista de valores de Id. de orden) y contenido mezclado.

Sin embargo, escribir consultas con el modo EXPLICIT puede ser un proceso complejo. Se pueden utilizar algunas de las características nuevas de FOR XML, como la posibilidad de escribir consultas anidadas FOR XML en modo RAW/AUTO/PATH y la directiva TYPE, en lugar de utilizar el modo EXPLICIT para generar las jerarquías. Las consultas FOR XML anidadas pueden generar el mismo XML que el modo EXPLICIT. Para obtener más información, vea Usar consultas FOR XML anidadas y Directiva TYPE en consultas FOR XML.

El modo PATH, junto con la característica de las consultas anidadas FOR XML, proporciona la flexibilidad del modo EXPLICIT de una manera más sencilla.

Estos modos solamente tienen efecto en la ejecución de la consulta para la que se configuraron. No afectan a los resultados de ninguna de las consultas posteriores.

La cláusula FOR XML no es válida en una selección que se use junto con una cláusula FOR BROWSE.

Ejemplo

La siguiente instrucción SELECT recupera información de las tablas Sales.Customer y Sales.SalesOrderHeader de la base de datos AdventureWorks2022 . Esta consulta especifica el modo AUTO en la cláusula FOR XML :

USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status
FROM Sales.Customer Cust 
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

La cláusula FOR XML y nombres de servidor

Cuando una instrucción SELECT con una cláusula FOR XML especifica un nombre de cuatro partes en la consulta, el nombre de servidor no se devuelve en el documento XML resultante cuando la consulta se ejecuta en el equipo local. Sin embargo, el nombre del servidor se devuelve como un nombre de cuatro partes cuando la consulta se ejecuta en un servidor de red.

Por ejemplo, considere esta consulta:

SELECT TOP 1 LastName
  FROM ServerName.AdventureWorks2022.Person.Person
  FOR XML AUTO;

 

Servidor local: cuando ServerName es un servidor local, la consulta devuelve el texto siguiente:

<AdventureWorks2022.Person.Person LastName="Achong" />  

 

Servidor de red: cuando ServerName es un servidor de red, la consulta devuelve el texto siguiente:

<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />

 

Evitar ambigüedad: se puede evitar esta ambigüedad especificando este alias:

SELECT TOP 1 LastName
  FROM ServerName.AdventureWorks2022.Person.Person x
  FOR XML AUTO;

La consulta con la ambigüedad eliminada devuelve ahora el texto siguiente:

<x LastName="Achong"/>

Consulte también

Sintaxis básica de la cláusula FOR XML
Usar el modo RAW con FOR XML
Usar el modo AUTO con FOR XML
Usar el modo EXPLICIT con FOR XML
Usar el modo PATH con FOR XML
OPENXML (SQL Server)
Agregar espacios de nombres a consultas con WITH XMLNAMESPACES