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