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 ...
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
Cursores en Transact SQL
Triggers en Transact SQL
Funciones en Transact SQL
Procedimientos almacenados en Transact SQL
Transacciones en Transact SQL

Afiliados
La Web del programador
MundoProgramacion


 

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


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: 8301 Fecha de publicación: 06/07/2007
Pedro Herrarte, es consultor independiente, ofreciendo sercivios 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.




18/08/2008 SQL Server 2008
Visitas: 39 | Comentarios: 0 | Archivo: Articulos
Categorias: Transact-SQL
Visitas: 131 | Comentarios: 0 | Archivo: Articulos
Categorias: C#|ADO.NET|LinQ
Visitas: 161 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 154 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 123 | Comentarios: 0 | Archivo: Articulos
Categorias: WCF
Visitas: 210 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 278 | Comentarios: 5 | Archivo: Articulos
Categorias: ASP.NET
Visitas: 4990 | Comentarios: 4 | Archivo: Articulos
Categorias: C#|Transact-SQL|LinQ
Visitas: 602 | Comentarios: 1 | Archivo: Articulos
Categorias: Visual Studio
Visitas: 1402 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL

Útimos temas recibidos en los foros ...
MAQUINAS VIRTUALES por victor ... [WIN 98/NT/2000/XP] 0 19/08/2008
Y lo mismo en WEB por systemat ... [C#] 1 18/08/2008
Manual del minicom de Linux con fotos. por Meta ... [UNIX] 4 17/08/2008
PROGRAMACION por JUANMA ... [Visual Basic .NET] 1 19/08/2008
Conectar ASP con B.D Informix por Franco ... [ASP] 9 02/05/2007
Codigo salir por Jazmin ... [ASP.NET] 1 18/08/2008
EXPORTAR DATOS A ARCHIVOS PLANOS. por WIX ... [ORACLE] 10 06/08/2007
formulario por artdark ... [C#] 2 04/08/2008
Codigo salir por Jazmin ... [ASP.NET] 0 18/08/2008
cambiar de modo un gried view por ivan ... [ASP.NET] 0 18/08/2008
ayuda urgente porfavor por vicancer ... [ASP.NET] 0 18/08/2008
pollo por hajaj ... [Actualidad] 1 15/08/2008

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 ...
06/10/2006 Importación de espacios de nombres    forma parte de...Tutorial C#
03/10/2006 Fundamentos de C#    forma parte de...Tutorial C#
03/10/2006 Programacion con C#    forma parte de...Tutorial C#
19/10/2006 Llamadas asíncronas    forma parte de...Tutorial C#
31/03/2006 Tipos de datos en PL/SQL    forma parte de...Tutorial PL/SQL
03/10/2006 Definición de clases    forma parte de...Tutorial C#
03/10/2006 Creación de objetos    forma parte de...Tutorial C#
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
29/04/2008 Leer un campo XML de SQL Server 2005 con C#
21/02/2007 Subconsultas    forma parte de...Tutorial SQL

 

Encuesta
Si trabajas con .NET ¿Que entorno utilizas?
[Ver] [Votar]