Compartir a través de


Usar consultas FOR XML anidadas

El xml tipo de datos y la directiva TYPE de las consultas FOR XML permiten procesar el XML devuelto por las consultas FOR XML en el servidor, así como en el cliente.

Procesamiento con variables de tipo xml

Puede asignar el resultado de la consulta FOR XML a una xml variable de tipo o usar XQuery para consultar el resultado y asignar ese resultado a una xml variable de tipo para más procesamiento.

DECLARE @x xml  
SET @x=(SELECT ProductModelID, Name  
        FROM Production.ProductModel  
        WHERE ProductModelID=122 or ProductModelID=119  
        FOR XML RAW, TYPE)  
SELECT @x  
-- Result  
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />  
--<row ProductModelID="119" Name="Bike Wash" />  

Además, puede procesar el XML devuelto en la variable @x, mediante uno de los métodos de tipo de datos xml. Por ejemplo, puede recuperar el valor del ProductModelID atributo mediante el método value().

DECLARE @i int;  
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));  
SELECT @i;  

En el ejemplo siguiente, el resultado de la FOR XML consulta se devuelve como un xml tipo, ya que la TYPE directiva se especifica en la FOR XML cláusula .

SELECT ProductModelID, Name  
FROM Production.ProductModel  
WHERE ProductModelID=119 or ProductModelID=122  
FOR XML RAW, TYPE,ROOT('myRoot');  
  

El resultado es el siguiente:

<myRoot>  
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />  
  <row ProductModelID="119" Name="Bike Wash" />  
</myRoot>  

Dado que el resultado es de xml tipo, puede especificar uno de los métodos de tipo de datos de xml directamente sobre este XML, como se muestra en la consulta siguiente. En la consulta, el método query() (tipo de datos xml) se usa para recuperar el primer <row> elemento secundario del <myRoot> elemento.

SELECT  (SELECT ProductModelID, Name  
         FROM Production.ProductModel  
         WHERE ProductModelID=119 or ProductModelID=122  
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');  
  

El resultado es el siguiente:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />  

Devolver resultados de consulta FOR XML internos a consultas externas como instancias de tipo xml

Puede escribir consultas anidadas FOR XML en las que el resultado de la consulta interna se devuelve como un xml tipo a la consulta externa. Por ejemplo:

SELECT Col1,   
       Col2,   
       ( SELECT Col3, Col4   
        FROM  T2  
        WHERE T2.Col = T1.Col  
        ...  
        FOR XML AUTO, TYPE )  
FROM T1  
WHERE ...  
FOR XML AUTO, TYPE;  

Observe lo siguiente en la consulta anterior:

  • El XML generado por la consulta interna FOR XML se agrega al XML generado por el externo FOR XML.

  • La consulta interna especifica la TYPE directiva . Por lo tanto, los datos XML devueltos por la consulta interna son de xml tipo . Si no se especifica la directiva TYPE, el resultado de la consulta interna `FOR XML` se devuelve como `nvarchar(max)` y los datos XML son transformados en entidades XML.

Controlar la forma de los datos XML resultantes

Las consultas FOR XML anidadas proporcionan más control al definir la forma de los datos XML resultantes. Puede usar consultas FOR XML anidadas para construir XML centrados en atributos y parcialmente centrados en elementos.

Para obtener más información sobre cómo especificar XML centrado en atributos y XML centrado en elementos con consultas FOR XML anidadas, consulte Consultas FOR XML comparadas con consultas FOR XML anidadas y Dar forma al XML con consultas FOR XML anidadas.

Puede generar jerarquías XML que incluyan hermanos especificando consultas anidadas en modo AUTO para FOR XML. Para obtener más información, consulte Generación de elementos del mismo nivel con una consulta de modo AUTO anidada.

Independientemente del modo que use, las consultas FOR XML anidadas proporcionan más control al describir la forma del XML resultante. Se pueden usar en lugar de consultas en modo EXPLICIT.

Ejemplos

En los temas siguientes se proporcionan ejemplos de consultas FOR XML anidadas.

Consulta FOR XML en comparación con la consulta FOR XML anidada
Compara una consulta FOR XML de nivel único con una consulta FOR XML anidada. En este ejemplo se incluye una demostración de cómo especificar XML centrado en atributos y centrado en elementos como resultado de la consulta.

Generación de elementos del mismo nivel con una consulta en modo AUTO anidado
Muestra cómo generar hermanos utilizando una consulta anidada en modo AUTOMÁTICO.

Usar consultas FOR XML anidadas en ASP.NET
Muestra cómo una aplicación ASPX puede usar FOR XML para devolver XML de SQL Server.

Dar forma a XML con consultas FOR XML anidadas
Muestra cómo usar consultas FOR XML anidadas para controlar la estructura de un documento XML creado por SQL Server.