Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 XMLse agrega al XML generado por el externoFOR XML.La consulta interna especifica la
TYPEdirectiva . Por lo tanto, los datos XML devueltos por la consulta interna son dexmltipo . 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.