Compartir por


FOR XML (SQL Server)

Se aplica a: SQL Server Azure SQL Database Azure 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 las subconsultas, FOR XML se puede usar en las instrucciones INSERT, UPDATE y DELETE. También se puede usar FOR XML 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 que devuelve 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 pedido) 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 RAW, AUTO o en modo 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.

FOR XML no es válido para ninguna selección que se use con una cláusula FOR BROWSE.

Ejemplos

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 del 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"/>