viernes, 17 de mayo de 2013

BULK INSERT EN SQLSERVER. INSERTAR DATOS DE FORMA MASIVA EN SQL SERVER DESDE UN FICHERO

Vamos a ver un ejemplo para poder insertar datos de forma masiva en una tabla de SQLSERVER.
El método consiste en tener dos ficheros:
 - Un fichero *.xml que define la estructura de la tabla
 - Un fichero *.txt que tiene los datos de la tabla

 Pues bien. La construcción del fichero de estructura quedaría tal que así:

 La estructura es común para cualquier tabla. Basta con añadir un nodo Field junto con un Column por cada campo que queramos mas.
 En la parte FIELD el atributo TERMINATOR: especifican el caracter o caracteres que se usaran para diferenciar que termina el dato de un campo y comienza el del siguiente. Nosotros hemos decidido usar siempre el mismo a expceción de fin de registro. Para validar los datos con mayor certeza.
"VARIOS.XML"

<?xml version="1.0"?>
<BCPFORMAT xmlns="
http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|}@" COLLATION="Modern_Spanish_CI_AS"   />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|}@" COLLATION="Modern_Spanish_CI_AS"   />
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|}@" COLLATION="Modern_Spanish_CI_AS"   />
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|}@#" COLLATION="Modern_Spanish_CI_AS"  />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="GRUPO" xsi:type="SQLSMALLINT"/>
<COLUMN SOURCE="2" NAME="CODIGO" xsi:type="SQLINT"/>
<COLUMN SOURCE="3" NAME="ULTIMAMODIFICACION" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="DESCRIPCION" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>


El fichero "VARIOS.TXT" quedaría algo tal que así:

8|}@1|}@30/03/2009 18:34:16|}@Comp. ALTO (Perfil)|}@#8|}@2|}@30/03/2009 18:34:16|}@Comp. ANCHO (Perfil)|}@#8|}@3|}@30/03/2009 18:34:16|}@Comp. ALTO x ANCHO (Cristal)|}@#8|}@4|}@30/03/2009 18:34:16|}@Comp. PREMARCO (Premarco)|}@#8|}@5|}@30/03/2009 18:34:16|}@Hierros|}@#1|}@1|}@30/03/2009 18:34:16|}@2|}@#14|}@1|}@20/08/2012 21:27:00|}@EL POZO CARNE|}@#14|}@2|}@20/08/2012 21:27:00|}@EL POZO CHARCUTERIA|}@#

Una vez tenemos los dos ficheros preparados lanzamos la consulta con la siguiente estructura sobre la bd:

 INSERT INTO NOMBRE_BASE_DATOS.dbo.NOMBRE_TABLA (GRUPO, CODIGO, ULTIMAMODIFICACION, DESCRIPCION) SELECT GRUPO, CODIGO, ULTIMAMODIFICACION, DESCRIPCION FROM OPENROWSET(BULK 'C:\Varios.txt', FORMATFILE= 'C:\varios.Xml') as T1

 Con esto hemos conseguido insertar todos los datos de un fichero *.CSV en una tabla de SQLSERVER

No hay comentarios:

Publicar un comentario

Jesús Moreno - Ingeniero Ténico Informático - consultor Informático

Hola, soy Jesús Moreno Ingeniero Técnico Informático en sistemas por la US y propietario de éste blog. Mi trabajo en los ultimos años se ...