Posteado por: edeortuzar | 17/04/2014

BULK masivo de archivos XML en SQL Server


Este ejemplo no solo sirve para realizar un bulk masivo de varios archivos XML sino también para un archivo XML. En un siguiente post mostraré como hacer consultas a un campo XML.

Primero creamos la tabla donde vamos a dejar la información, como vemos tenemos un campo Id autoincremental y el campo XMLData que es de tipo XML, donde sucederá la magia:

CREATE TABLE InformacionXML
(
Id INT IDENTITY PRIMARY KEY,
XMLData XML
)

Vamos a estar usando el comando XP_CMDSHELL, para esto tenemos que habilitarlo, en caso que no esté habilitado debemos ejecutar las siguientes líneas:

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

A continuación es el proceso que busca en la carpeta que especifiquemos todos los arhivos .XML y luego recorre cada uno para generar un registro en la tabla InformacionXML.

create table #tb(filename varchar(255)); --Creamos una tabla temporal para los nombres de los archivos

insert #tb exec xp_cmdshell 'dir C:\resultadosXML\*.xml /b'; --Insertamos en dicha tabla los nombres de los archivos .XML que existen en la carpeta especificada

delete #tb where filename is null; 

declare @filename varchar(255);

declare @cmd nvarchar(4000);

declare @xml xml;

declare cur cursor for select filename from #tb;

open cur;

fetch next from cur into @filename;

while @@Fetch_status=0
	begin

		set @cmd = N'INSERT INTO InformacionXML(XMLData) SELECT CONVERT(XML, BulkColumn) AS BulkColumn FROM OPENROWSET(BULK ''C:\resultadosXML\' + @filename + ''', SINGLE_BLOB) AS x;'; --Por cada nombre de archivo que existe en la tabla temporal generamos una sentencia de insert para luego ejecutarla. Acá también deberas tener que cambiar la ruta de la carpeta en caso que sea otra.

		exec sp_executesql @cmd;


		fetch next from cur into @filename;

	end

close cur;

deallocate cur;

Listo, esto es todo.

Espero que les sirva.

Saludos.

Anuncios

Responses

  1. donde pones lo del comando XP_CMDSHELL,

    • Hola Lupia. Fijate que luego de crear la tabla temporal donde se almacenan los nombres de los archivos se ejecuta el XP_CMDSHELL, pero eso es solo para insertar en la temporal los nombres de los archivos.

      El proceso donde se importan los archivos se hace por medio de la sentencias:

      
      set @cmd = N'INSERT INTO InformacionXML(XMLData) SELECT CONVERT(XML, BulkColumn) AS BulkColumn FROM OPENROWSET(BULK ''C:\resultadosXML\' + @filename + ''', SINGLE_BLOB) AS x;';
      exec sp_executesql @cmd;
      
      

      Espero que sea esto a lo que te referis.

      Cualquier cosa a tu disposición.

      Saludos.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: