Buscar este blog

lunes, 18 de julio de 2011

Select FOR XML

Clausula FOR XML.

A partir de la version 2000 SQL Server incluye la clausula FOR XML para la consultas. Sin embargo, es a partir de la versión 2005 cuando se integra XML como tipo de dato nativo.

Cuando especificamos la clausula FOR XML el resultado de la consulta es devuelto en formato XML.

La clausula FOR XML admite los siguientes modos que representan el formato en el que el XML es devuelto:

  • XML AUTO, el modo AUTO emplea los campos en la declaración SELECT para formar una jerarquía simple XML.
  • XML RAW, el modo RAW genera elementos únicos, los cuales se denominan row, por cada fila retornada.
  • EXPLICIT, el modo EXPLICIT requiere un formato específico que puede ser mapeado en casi cualquier forma XML, y al mismo tiempo ser formulado por una sola consulta SQL.

Adicionalmente, disponemos de dos opciones más TYPE y ELEMENTS que determinan el formato del XML resultante. Los vemos con ejemplos.

Un ejemplo de XML AUTO.


SELECT
CO_FAMILIA, FAMILIA
FROM FAMILIAS
ORDER BY FAMILIA
FOR XML AUTO, TYPE

Obtendremos el siguiente resultado:


 

Podemos obtener el resultado como elementos de la siguiente forma:


SELECT
CO_FAMILIA, FAMILIA
FROM FAMILIAS
FOR XML AUTO, ELEMENTS

Obtendremos el siguiente resultado:


        1
        FAMILIA 1
        2
        FAMILIA 2
        3
        FAMILIA 3
        4
        FAMILIA 4
 

Ahora un ejemplo de XML RAW:


SELECT
CO_FAMILIA, FAMILIA
FROM FAMILIAS
ORDER BY FAMILIA
FOR XML RAW , TYPE

Obtenemos el siguiente resultado:


Podemos obtener el resultado como elementos de la siguiente forma:


        1
        FAMILIA 1
        2
        FAMILIA 2
        3
        FAMILIA 3
        4
        FAMILIA 4
 

También es posible especificar el nodo que queremos que muestre:


SELECT
CO_FAMILIA, FAMILIA
FROM FAMILIAS
ORDER BY FAMILIA
FOR XML RAW ('FamiliasDeProductos') , TYPE 

Devuelve el siguiente resultado:


 

Del mismo modo con la opción ELEMENTS:


SELECT
CO_FAMILIA, FAMILIA
FROM FAMILIAS
ORDER BY FAMILIA
FOR XML RAW ('FamiliasDeProductos') , ELEMENTS

Obtendremos el siguiente resultado:


        1
        FAMILIA 1
        2
        FAMILIA 2
        3
        FAMILIA 3
        4
        FAMILIA 4

Ahora un ejemplo con el formato XML EXPLICIT.


SELECT

1 AS TAG, -- La primera columna debe tener el alias TAG
  NULL AS PARENT, -- La segunda columna debe tener el alias PARENT 
  -- El resto de columnas deben tener el alias en el formato:
  -- !! 
  CO_FAMILIA as "FamiliaDeProductos!1!CODIGO_FAMILIA", 
  FAMILIA    as "FamiliaDeProductos!1!DESCRIPCION"
FROM FAMILIAS
ORDER BY FAMILIA
FOR XML EXPLICIT

Obtenemos el siguiente resultado:


Campos y variables XML.

Dado que XML es un tipo nativo de XML podemos definir tablas con campos de tipo XML, variables ...

El siguiente ejemplo muestra como trabajar con campos y variables XML.


-- Primero creamos una tabla con un campo XML
CREATE TABLE tablaXML
(
ID int not null identity, 
DOC xml null, 
constraint PK_tablaXML PRIMARY KEY (ID)
)
 
GO
 
DECLARE @xml xml -- Variable de tipo XML

-- Leemos los datos de la tabla FAMILIAS
SET @xml = (SELECT CO_FAMILIA, FAMILIA
             FROM FAMILIAS FOR XML AUTO)

-- y los guardamos en nuestra tabla
INSERT INTO tablaXML 
(DOC) VALUES (@xml)
-- Hacemos lo mismo con los productos
SET @xml = (SELECT *
             FROM PRODUCTOS FOR XML AUTO)

INSERT
INTO tablaXML
(DOC) VALUES (@xml)

-- Consultamos la tabla y vemos el resultado
SELECT * FROM tablaXML 

Cuando consultemos la tabla tendremos la siguiente información (en mi caso claro!):


  
  
  
  
  
  
   

No hay comentarios:

Publicar un comentario