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, FAMILIAFROM FAMILIASORDER BY FAMILIAFOR 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, FAMILIAFROM FAMILIASFOR 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, FAMILIAFROM FAMILIASORDER BY FAMILIAFOR 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, FAMILIAFROM FAMILIASORDER BY FAMILIAFOR 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, FAMILIAFROM FAMILIASORDER BY FAMILIAFOR 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 FAMILIASORDER BY FAMILIAFOR 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" />
|