Skip to content

Obtener el resultado de una consulta en formato XML con SQL Server

17/02/2013
SQLServerLogo

Microsoft SQL Server provee mecanismos para obtener el resultado de una consulta en formato XML desde SQL Server 2000 en adelante. Estos mecanismos fueron perfeccionándose en cada versión, siendo cada vez más simple y poderoso el generar datos XML a partir de la ejecución de consultas o procedimientos.

En este post les presento ejemplos simples de consultas SQL y variantes de la instrucción FOR XML para obtener los resultados en distintas formatos. En todos los casos se utiliza como base de ejemplo la base AdventureWorks2012, que puede descargarse en el site de Codeplex, como pueden ver en este post.

FOR XML RAW

SELECT H.SalesOrderID,H.DueDate,D.ProductID,D.OrderQty
FROM Sales.SalesOrderHeader H
JOIN Sales.SalesOrderDetail D ON D.SalesOrderID=H.SalesOrderID
ORDER BY H.SalesOrderID,D.SalesOrderDetailID
FOR XML RAW

Esta es la forma más simple de presentar los datos. Se genera un elemento row por cada registro del resultado y atributos por cada columna del mismo.

FOR XML AUTO

SELECT H.SalesOrderID,H.DueDate,D.ProductID,D.OrderQty
FROM Sales.SalesOrderHeader H
JOIN Sales.SalesOrderDetail D ON D.SalesOrderID=H.SalesOrderID
ORDER BY H.SalesOrderID,D.SalesOrderDetailID
FOR XML AUTO

Este formato interpreta de forma automática la estructura de la consulta y devuelve un formato relacionado con las tablas que participan en ella. Se genera un esquema de anidamiento a partir del uso de cláusulas JOIN, considerando como la tabla padre la que aparece más a la izquierda en la escritura de la consulta.

FOR XML PATH (a partir de SQL Server 2005)

SELECT H.SalesOrderID ‘Order/Number’,
    H.DueDate ‘Order/Date’,
    D.ProductID ‘Order/Products/Product’,
    D.OrderQty ‘Order/Products/Quantity’
FROM Sales.SalesOrderHeader H
JOIN Sales.SalesOrderDetail D ON D.SalesOrderID=H.SalesOrderID
ORDER BY H.SalesOrderID,D.SalesOrderDetailID
FOR XML PATH

Con la instrucción FOR XML PATH tenemos el control preciso del formato de salida, pudiendo indicar la anidación de datos y si un determinado campo será representado como un elemento o como un atributo dentro de un elemento.

XML anidado y formateo avanzado

SELECT H.SalesOrderID ‘Number’,
     H.DueDate ‘Date’,
     (SELECT D.ProductID ‘ProductID’,
         D.OrderQty ‘Quantity’
         FROM Sales.SalesOrderDetail D
         WHERE D.SalesOrderID=H.SalesOrderID
         ORDER BY D.SalesOrderDetailID
         FOR XML PATH(‘Product’),TYPE) ‘Products’
FROM Sales.SalesOrderHeader H
ORDER BY H.SalesOrderID
FOR XML PATH(‘Order’),ROOT (‘Orders’)

En este ejemplo final muestro la posibilidad de anidar datos en formato XML mediante la cláusula TYPE. También se ve el cambio del nombre del elemento que se genera por cada registro al valor “Order” y el agregado de una raíz al resultado, con la cláusula ROOT. Es importante indicar que si no se agrega una raíz al resultado de una consulta usando FOR XML, lo que se obtiene son fragmentos de XML, pero no un documento bien formado.

Espero que estos ejemplos sean de utilidad. Para más información sobre el uso de la cláusula FOR XML les recomiendo este link de MSDN.

One Comment
  1. Interesante Pero PATH solo es a pArtir de SQL SERVER 2005

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: