You are on page 1of 6

Exportar datos en formato XML en SQL Server 2005

Me surgi este tema en el trabajo, y busque informacin por Internet. Hay numerosos ejemplos de importacin pero los de exportacin son muy escasos y confusos, as que decid resumir de forma bsica las herramientas que encontr en mi pequea bsqueda. En este texto vamos a ver como generar un documento XML directamente haciendo una consulta sobre la base de datos y como guardar el resultado en un archivo XML fsico en la maquina. Adems veremos como alternativa como recuperar el resultado de una consulta de este tipo en .NET Consultas de Seleccin para XML mediante FOR XML: La consulta ms bsica de este tipo la podemos construir as:

SELECT * FROM TABLA FOR XML AUTO

Y nos devolver al parecido a esto:

<TABLA CAMPO1="1" CAMPO2="correo1@pruebas.com"/> <TABLA CAMPO1="2" CAMPO2="correo2@ pruebas.com "/> Como veis de esta manera el XML devuelto no tiene nodo principal y cada subnodo lleva como nombre el nombre de la tabla y como atributos los nombres de cada campo y sus contenidos. Existen otras dos formas bsicas de hacer consultas FOR XML: RAW Y PATH
SELECT * FROM TABLA FOR XML RAW

<row CAMPO1="1" CAMPO2="correo1@pruebas.com"/> <row CAMPO1="2" CAMPO2="correo2@ pruebas.com "/> Con RAW los subnodos siempre de nombraran como "row" Y PATH que a simple vista nos devolvera el mismo resultado que AUTO permite una mejor mezcla entre parmetros y atributos dentro de cada subnodo devuelto en el XML. Os voy a mostrar un par de utilidades para mejorar el aspecto del XML devuelto aunque no me voy a centrar en mostrar todas. Podis consultar el resto de opciones en: http://msdn2.microsoft.com/es-es/library/ms190922.aspx Podemos por ejemplo devolver documentos Atom de una manera sencilla as:
SELECT TOP 2 ID_TABLA as 'id' FROM TABLA as item FOR XML AUTO, ROOT ('feed'), ELEMENTS

Que devolver algo as:

<feed> <item> <id>1</id> </item> <item>

<id>2</id> </item> </feed> Primero sealar en los ALIAS de la tabla como de los campos son reconocidos por la consulta y aadidos al XML remplazando sus nombres originales. El modificador ELEMENTS indica a la consulta que cada campo debe ir como un subnodo separado y no como un atributo. Con el modificador ROOT aadimos un nodo principal al documento, y as de paso hacemos cumplir la normativa XML que indica que todo documento XML debe tener un nico nodo principal. Sin embargo en el caso de un documento Atom, para el nodo principal "feed" necesitamos declarar un espacio de nombres. Para lo cual SQL Server nos provee de la funcin WITH XMLNAMESPACES que deberemos poner justo antes de nuestra consulta de seleccin:
WITH XMLNAMESPACES (DEFAULT 'http://www.w3.org/2005/Atom') SELECT TOP 2 ID_TABLA as 'id' FROM TABLA as item FOR XML AUTO, ROOT ('feed'), ELEMENTS

Y esto generar un documento ms acorde con el estndar Atom: <feed xmlns="http://www.w3.org/2005/Atom"> <item> <id>1</id> </item> <item> <id>2</id> </item> </feed> Podis ver la documentacin para insertar ms espacios de nombres a un nodo: http://msdn2.microsoft.com/es-es/library/ms177607.aspx Ahora que ya tenemos nuestro documento XML a nuestro gusto es la hora de guardarlo. Para ello vamos a utilizar la funcin "xp_cmdshell" y el comando "sqlcmd". La funcin "xp_cmdshell" requiere cambiar un poco la configuracin de nuestra base de datos, para ello vamos a utilizar:
EXEC sp_configure 'show advanced options', 1; GO RECONFIGURE; GO EXEC sp_configure 'xp_cmdshell', 1; GO RECONFIGURE; GO

Que nos dar permisos para utilizar dicha funcin.

Una vez reconfigurada nuestra base de datos vamos a crear un archivo de texto en el disco duro donde escribiremos nuestras consulta y que luego ser ledo por el comando "sqlcmd" y ejecutado. Nuestra consulta ser algo as:
:XML ON USE nuestraBaseDeDatos GO SET NOCOUNT ON SELECT '<?xml version="1.0" encoding="utf-8" ?>'; WITH XMLNAMESPACES ( 'http://pruebas.com/2008/FS' as fs, DEFAULT 'http://www.w3.org/2005/Atom' ) SELECT ID_TABLA as 'fs:recid' FROM TABLA as item FOR XML AUTO, ROOT ('feed'), ELEMENTS SET NOCOUNT OFF

Vamos a explicar un poco esta consulta: El modificador :XML ON indicar a la base de datos el tipo de datos que vamos a devolver. Si no ponemos este modificador es muy probable que lo que nos escriba posteriormente en el archivo sea ilegible. Este modificador solo es necesario usarlo si vamos a utilizar luego el comando "sqlcmd". Modificamos el valor de NOCOUNT para evitar que en el archivo se grabe una lnea muy molesta que indica el nmero de filas afectadas. Adems aadimos antes de la consulta la declaracin del documento XML para que la inserte por encima del resultado de la consulta. Esta consulta la grabamos en nuestro disco, por ejemplo en "c:\consultaPrueba.sql". Y ya podemos generar nuestro documento XML de esta forma:
DECLARE @cmd VARCHAR(1000) SELECT @cmd = 'sqlcmd -Uusuario -Pcontrasea -i "c:\consultaPrueba.sql" -o "c:\resultadoPrueba.xml"' EXEC master..xp_cmdshell @cmd

Lo que nos generar un archivo "c:\resultadoPrueba.xml" con el contenido de nuestra consulta. http://msdn2.microsoft.com/es-es/library/ms175046.aspx http://msdn2.microsoft.com/es-es/library/ms162773.aspx Por ultimo me gustara ensearos como recuperar el contenido de una consulta de tipo FOR XML desde .NET:

Para ello tenemos que utilizar una funcin especial de nuestro SqlCommand, la funcin ExecuteXmlReader. Debemos usarla ya que permite devoluciones de cadenas XML superiores a 2 mil caracteres que de otra manera se truncaran o seria devueltas en varios conjuntos de resultados. As pues quedara algo as:
SqlConnection con = new SqlConnection(cadenaConexion); SqlCommand comando = new SqlCommand("SELECT ID_TABLA as 'recid' FROM TABLA as item FOR XML AUTO, ROOT ('feed'), ELEMENTS", con); con.Open(); XmlReader reader = comando.ExecuteXmlReader(); XmlDocument doc = new XmlDocument(); doc.Load(reader); doc.PrependChild(doc.CreateNode(XmlNodeType.XmlDeclaration, "", "")); con.Close();

En este caso es importante no cerrar la conexin antes de cargar el XmlReader en el XmlDocument, en el caso contrario obtendremos una excepcin. Tambin he aadido como se insertara en este caso la declaracin del documento XML, como en el caso anterior. Publicado tambin en: http://www.moreplus.es

Trucos de Sql Server Exportacin de datos de una tabla SQL Server a un fichero XML
Para exportar los datos de una tabla SQL Server a un fichero XML haremos lo siguiente: - Creacin de la consulta SQL. - Creacin del Template. - Ejecucin del Stored Procedure sp_makewebtask. - Ver resultado.

Creacin de consulta SQL En la sentencia SQL seleccionaremos los campos que queremos exportar en el fichero XML.

SELECT idArticulo,

FechaEnvio, Mensaje FROM TABLA WHERE ESTADO=2

Creacin del Template En este proceso es necesario tener un fichero Template. El fichero Template nos permite dar el formato deseado al fichero XML. Para crear este fichero podemos utilizar el bloc de notas.

<%begindetail%>

<%enddetail%>

En los <%insert_data_here%> se colocarn los datos exportados. Stored Procedure sp_makewebtask Sp_makewebtask es un stored procedure que se encarga de generar pginas html. Usando el Template podemos utilizar este stored para crear ficheros XML. Sp_makewebtask tiene muchsimos parmetros, pero solamente 3 son bsicos para exportar los datos. EXEC sp_makewebtask @outputfile, @query, @templateFile @OutPutFile: Path y nombre de la salida del fichero @query: Consulta SQL @TemplateFile: Ruta fsica del fichero del Template

EXEC sp_makewebtask @outputfile = 'c:\temp\Fichero.xml', @query = 'SELECT idArticulo,FechaEnvio,mensaje FROM TABLA WHERE ESTADO=2', @templatefile ='C:\temp\Template.tpl'

Resultado

c:\temp\Fichero.xml

< novedades idArticulo=2323 fecha=2005-02-04 mensaje=Este Artculo> <="" novedades=""> <="" novedades=""> .

Notas: El fichero Template debe existir en el servidor. Si en la ejecucin SQL SERVER no encuentra la dll xpweb70.dll buscar el stored procedure xp_makewebtask ubicado en los storeds procedures extendidos de la dbo.master y asociarle la dll xpweb70.dll 23/02/2005 Pol Salvat Rius www.mistrucos.net v.1.1 __________________________________________________________________________

You might also like