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:


<
FAMILIAS CO_FAMILIA="1" FAMILIA="FAMILIA 1" />

<FAMILIAS CO_FAMILIA="2" FAMILIA="FAMILIA 2" />

<FAMILIAS CO_FAMILIA="3" FAMILIA="FAMILIA 3" />

<FAMILIAS CO_FAMILIA="4" FAMILIA="FAMILIA 4" />

    Podemos obtener el resultado como elementos de la siguiente forma:


SELECT
CO_FAMILIA, FAMILIA

FROM FAMILIAS

FOR XML AUTO, ELEMENTS

    Obtendremos el siguiente resultado:


<
FAMILIAS>

<CO_FAMILIA>1</CO_FAMILIA>

<FAMILIA>FAMILIA 1</FAMILIA>

</FAMILIAS>

<FAMILIAS>

<CO_FAMILIA>2</CO_FAMILIA>

<FAMILIA>FAMILIA 2</FAMILIA>

</FAMILIAS>

<FAMILIAS>

<CO_FAMILIA>3</CO_FAMILIA>

<FAMILIA>FAMILIA 3</FAMILIA>

</FAMILIAS>

<FAMILIAS>

<CO_FAMILIA>4</CO_FAMILIA>

<FAMILIA>FAMILIA 4</FAMILIA>

</FAMILIAS>

    Ahora un ejemplo de XML RAW:   


SELECT
CO_FAMILIA, FAMILIA

FROM FAMILIAS

ORDER BY FAMILIA

FOR XML RAW , TYPE

    Obtenemos el siguiente resultado:


<
row CO_FAMILIA="1" FAMILIA="FAMILIA 1" />

<row CO_FAMILIA="2" FAMILIA="FAMILIA 2" />

<row CO_FAMILIA="3" FAMILIA="FAMILIA 3" />

<row CO_FAMILIA="4" FAMILIA="FAMILIA 4" />

    Podemos obtener el resultado como elementos de la siguiente forma:


<
row>

<CO_FAMILIA>1</CO_FAMILIA>

<FAMILIA>FAMILIA 1</FAMILIA>

</row>

<row>

<CO_FAMILIA>2</CO_FAMILIA>

<FAMILIA>FAMILIA 2</FAMILIA>

</row>

<row>

<CO_FAMILIA>3</CO_FAMILIA>

<FAMILIA>FAMILIA 3</FAMILIA>

</row>

<row>

<CO_FAMILIA>4</CO_FAMILIA>

<FAMILIA>FAMILIA 4</FAMILIA>

</row>

    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:


<
FamiliasDeProductos CO_FAMILIA="1" FAMILIA="FAMILIA 1" />

<FamiliasDeProductos CO_FAMILIA="2" FAMILIA="FAMILIA 2" />

<FamiliasDeProductos CO_FAMILIA="3" FAMILIA="FAMILIA 3" />

<FamiliasDeProductos CO_FAMILIA="4" FAMILIA="FAMILIA 4" />

    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:


<
FamiliasDeProductos>

<CO_FAMILIA>1</CO_FAMILIA>

<FAMILIA>FAMILIA 1</FAMILIA>

</FamiliasDeProductos>

<FamiliasDeProductos>

<CO_FAMILIA>2</CO_FAMILIA>

<FAMILIA>FAMILIA 2</FAMILIA>

</FamiliasDeProductos>

<FamiliasDeProductos>

<CO_FAMILIA>3</CO_FAMILIA>

<FAMILIA>FAMILIA 3</FAMILIA>

</FamiliasDeProductos>

<FamiliasDeProductos>

<CO_FAMILIA>4</CO_FAMILIA>

<FAMILIA>FAMILIA 4</FAMILIA>

</FamiliasDeProductos>

   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:

-- <NombreNodo>!<nodo>!<atributo>

CO_FAMILIA as "FamiliaDeProductos!1!CODIGO_FAMILIA",

FAMILIA as "FamiliaDeProductos!1!DESCRIPCION"

FROM FAMILIAS

ORDER BY FAMILIA

FOR XML EXPLICIT

    Obtenemos el siguiente resultado:


<
FamiliaDeProductos CODIGO_FAMILIA="1" DESCRIPCION="FAMILIA 1" />

<FamiliaDeProductos CODIGO_FAMILIA="2" DESCRIPCION="FAMILIA 2" />

<FamiliaDeProductos CODIGO_FAMILIA="3" DESCRIPCION="FAMILIA 3" />

<FamiliaDeProductos CODIGO_FAMILIA="4" DESCRIPCION="FAMILIA 4" />

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!):


<!--
Registro de la tabla familias-->

<FAMILIAS CO_FAMILIA="1" FAMILIA="FAMILIA 1" />

<FAMILIAS CO_FAMILIA="2" FAMILIA="FAMILIA 2" />

<FAMILIAS CO_FAMILIA="3" FAMILIA="FAMILIA 3" />

<FAMILIAS CO_FAMILIA="4" FAMILIA="FAMILIA 4" />

<!--Registro de la tabla Productos-->

<PRODUCTOS CO_PRODUCTO="1" CO_CATEGORIA="1" PRODUCTO="PRODUCTO 1" />

<PRODUCTOS CO_PRODUCTO="2" CO_CATEGORIA="1" PRODUCTO="PRODUCTO 2" />

<PRODUCTOS CO_PRODUCTO="3" CO_CATEGORIA="2" PRODUCTO="PRODUCTO 3" />

 

Pedro  Herrarte  Sánchez
Select FOR XML
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:06/07/2007
Última actualizacion:06/07/2007
Visitas totales:77309
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com