InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial de Transact SQL
Introducción a Transact SQL
Programación con Transact SQL
Fundamentos de Transact SQL
Tipos de datos en Transact SQL
Variables en Transact SQL
Equivalencia de datos de SQL Server y .NET
Operadores en Transact SQL
Estructuras de control en Transact SQL
Control de errores en Transact SQL
Consultar datos en Transact SQL
Consultas agregadas
Select FOR XML
Operaciones con conjuntos.
Insertar datos en Transact SQL
Actualizar datos en Transact SQL
Borrar datos en Transact SQL
Transacciones en Transact SQL
Procedimientos almacenados en Transact SQL
Funciones en Transact SQL
Funciones integradas de Transact SQL (I)
Triggers en Transact SQL
Cursores en Transact SQL
SQL dinámico en Transact SQL
También puedes ver ...
Templates css para web
Simular TRUNC en SQL Server
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
Aprende Ajax desde cero
SET IDENTITY_INSERT ON y LinqToSQL
SQL Server 2008
LinQ To SQL - Un ejemplo sencillo
Formatear números en SQL Server
Leer un campo XML de SQL Server 2005 con C#
SQL dinámico en Transact SQL


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" />

 


Inicio | Tutorial de Transact SQL Consultas agregadasTutorial de Transact SQLOperaciones con conjuntos. Versión para imprimir Foros de consulta

 
muy interesante por Aldeamedia
Respuesta recibida el [05/07/2007 10:22:47]
Muy interesante, no te olvides de incluir en el próximo articulo la sentencia FOR XML PATH nueva en 2005 y que sustituye a EXPLICIT

Personalmente yo añadiría que FOR XML TYPE se usa para devolver un tipo de dato SQL-XML en vez de un varchar que me parece que se te ha escapado :)

 
Pablo ... entra al panel de co... por Anónimo
Respuesta recibida el [05/07/2007 11:43:31]
Pablo ... entra al panel de control y colabora en el puto tutorial!!! ya se que faltan historias (buscar con expresiones XPATH por ejemplo), pero ni el tutorial esta acabado ni tengo tiempo!!!
Lo que mas mira la gente son los ejemplos, así que me he centrado en ello y he pasado un poco de la teria.
Por cierto, a ver si coges el telefono!

 
Liado por Aldeamedia
Respuesta recibida el [05/07/2007 01:57:59]
Ya sabes que mis horarios son bastante chungos también.
No pensaba escribir en el tutorial por que pensé que querias hacerlo tú si saco un cable a ver si te puedo echar una mando aunuqe ya sabes que yo soy más de teoría y respuestas en los foros que de practicas en los contenidos (aparte de mantener el servidor engrasado :))

 
Explicit por eider mauricio aristizabal erazo
Respuesta recibida el [11/09/2007 09:14:59]
En la opcion Explicit el primer campo debe ser un numero entero mayor que 1.
Aunque olvidaste comentar el PATH me parecen muy claros tus ejemplos. Gracias!

 
Explicit por eider mauricio aristizabal erazo
Respuesta recibida el [11/09/2007 09:17:44]
Correccion: En la opcion Explicit el primer campo debe ser un numero entero mayor que 0.
Aunque olvidaste comentar el PATH me parecen muy claros tus ejemplos. Gracias!

 
.... por Yo
Respuesta recibida el [27/11/2007 07:19:39]
xD!!!

 
Pregunta por Armando Gomez
Respuesta recibida el [21/03/2008 12:20:56]
Cordial saludo, realizo la consulta en sql con "sql for" como dice el articulo , pero el xml resultado sale con errores, NO cierra (/>) los elementos. Que me pasa?
gracias

 
...... por Yo
Respuesta recibida el [28/04/2008 03:37:10]
...

 
kkkkkkkkkkkkk por Mr.K
Respuesta recibida el [14/08/2008 02:54:01]
comprate un perro... demasiado resumido :P

 
excelente por nemon, experto en bases de datos
Respuesta recibida el [03/11/2008 11:56:47]
Me parese una seccion excelente no
necesita explicacion, y lo del path,
complementa esa excelencia

 
Muy bueno por Excelente!!
Respuesta recibida el [28/05/2009 12:34:44]
Me parece  Una excelente aportación ademas de que muy bien explicado..
Gracias por compartir!

 
DUDAS CON MODO TYPE por OSKR
Respuesta recibida el [14/07/2009 08:57:10]
HOLA  AMIGO  TENGO  UN  PROBLEMA  RELACIONADO  CON  TYPE   EN  FOR XML
ME DICE QUE ERROR RELACIONADO CON TYPE.........EN SQL2000

 
gracias... por Anónimo
Respuesta recibida el [31/07/2009 03:49:03]
gracias

 
buenisimo por Anónimo
Respuesta recibida el [20/08/2009 01:08:27]
Muy buenos ejemplos, la verdad e sque uno siempre busca algo como esto.
Personas que se solidaricen mostrando álgo más que pura teoría, pues no todos tienen tiempo para leerse todo :(.

 
Una dudita por Lara
Respuesta recibida el [05/09/2009 12:43:37]
El código que viene en el apartado Campos y variables XML dónde hay que ponerlo, yo quiero crear un documento XML con todos los datos de todas las tablas de mi BD.

 
MUY BUENO... por jAMEX
Respuesta recibida el [07/10/2009 11:07:34]
MUY BUENO

 
Muy buen articulo por dani3lla
Respuesta recibida el [05/02/2010 02:37:24]
Felicitaciones los ejemplos son lo suficientemente claros, y como que dan el chispazo para seguir investigando a cerca del tema. Muchas gracias pues a mi me fue muy util


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial de Transact SQL Consultas agregadasTutorial de Transact SQLOperaciones con conjuntos. Versión para imprimir

Select FOR XML
Autor: Pedro Herrarte Sánchez
Visitas: 25955 Fecha de publicación: 06/07/2007
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, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, 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).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 86 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 791 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 739 | Comentarios: 3 | Archivo: Articulos
Visitas: 3134 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14487 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1474 | Comentarios: 3 | Archivo: Articulos
Visitas: 690 | Comentarios: 2 | Archivo: Articulos
Visitas: 368 | Comentarios: 0 | Archivo: Articulos
Visitas: 2006 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 135 26/01/2010
pensiones por eduard ... [Visual Basic 6.0] 0 11/03/2010
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 41 26/10/2006
cap de setmana genial por ramón ... [Java] 0 11/03/2010
cetificado de pension por RICARDDO RAFAEL SOLANO ORZCO ... [Actualidad] 0 11/03/2010
solicitud de aifiliacion a porvernir por julios ... [Actualidad] 2 11/03/2010
Solicitar el certificado de pensiones de Abelardo Alfonso Serrano Banegas C.C. 18 971 771 de Curumani Cesar por Marta ... [Actualidad] 0 11/03/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 50 10/02/2010
cerificado fondo horizonte de pensiones y cesantias por carlos fideligno torres herrera ... [Actualidad] 146 18/01/2010
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 109 28/01/2010
certificado de fondos de pensiones horizonte por mona ... [Actualidad] 5 03/03/2010
Certificado de afiliacion AFP (PENSIONES) Horizonte por Sandris ... [Actualidad] 68 30/01/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
16/04/2004 C# y como crear instancias de clases desde un tipo String utilizando .NET FrameWork.
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
09/05/2006 Como leer XML con C#
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
03/10/2006 Fundamentos de C#    forma parte de...Tutorial C#
05/07/2007 Consultar datos en Transact SQL    forma parte de...Tutorial de Transact SQL
12/01/2006 Introducción a PLSQL    forma parte de...Tutorial PL/SQL
19/10/2006 Llamadas asíncronas    forma parte de...Tutorial C#
14/07/2006 Tablas PL/SQL    forma parte de...Tutorial PL/SQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]