Twitter Facebook Google + RSS Feed

Importación de archivos CSV con el comando Bulk Insert

6
SQL Server

Lunes, 07 de septiembre de 2009 a las 16:42hs por Dario Krapp

En más de una ocasión nos fue necesario importar datos en formato CSV a una tabla en nuestro servidor de base de datos SQL Server, después de esta última vez me pareció una buena idea hacer un muy breve comentario de una de las posibilidades disponibles, así es que presento al comando BULK INSERT, el cual permite llevar a cabo esta operación.
Antes que nada debemos suponer que poseemos la siguiente tabla:

Tabla de ejemplo

El siguiente archivo CSV:

1,Cabecera1,20001211,20001211 22:10:30,41422.66, 22.22
2,Cabecera2,20001212,20001212 22:10:32,1234567.123456, 22.4444

Y la clara intención de copiar la información desde el archivo CSV hacia la tabla en cuestión. Deberemos entonces utilizar el siguiente comando:

BULK INSERT
	Cabecera 
FROM 
	'C:\....\archivo.csv'
WITH (
    FIELDTERMINATOR= ',',
    ROWTERMINATOR = '\n' 
);

Donde hemos especificado origen (el path al archivo CSV) destino (la tabla Cabecera) y los separadores de filas y columnas en los argumentos ROWTERMINATOR y FIELDTERMINATOR.

El resultado de la operación generará el siguiente resultado:

Ejecución del comando SELECT luego del BULK INSERT

Donde puede verse que los datos han sido agregados aunque algunos de ellos (IngresoAnual y Numero) han quedado truncados en la tabla Cabecera al no poder ser representados en forma completa en los tipos de datos destino. Si se produce algún error de conversión de datos durante la importación la fila será omitida, el mismo comportamiento utilizará el comando si se viola la constraint NOT NULL.
En otros tipos de errores, como por ejemplo, violación de la constraint UNIQUE, la importación fallará, cabe mencionar que para el caso particular de las constraints CHECK y FOREIGN KEY, las mismas serán por defecto omitidas, al menos que se utilice el parámetro CHECK_CONSTRAINTS en la sentencia BULK INSERT para especificar lo contrario.
El comando BULK INSERT posee además de los pocos parámetros que hemos visto una diversa cantidad de los mismos, como por ejemplo FIRSTROW y LASTROW que permite especificar la fila inicial y final de copia, FIRE_TRIGGERS que permite indicar si se dispararán los triggers de las tablas durante la importación de datos, KEEPIDENTITY que permite especificar de qué manera se manejarán la columnas identity durante la importación y KEEPNULLS que indica si las columnas vacías deberán conservar el valor NULL.
Dejo para quien este interesado el siguiente link donde podrán obtener más información del comando, de todos los argumentos disponibles (que son muchos más que los que hemos mencionado) y de su uso:

http://technet.microsoft.com/es-es/library/ms188365.aspx

Espero que esta pequeña contribución haya servido para quienes no conocieran la existencia de este comando.


6 comentarios »

  1. Rikku dice:

    Buenas,
    Gracias por facilitar información sobre la sentencia BULK INSERT aunque me surge la siguiente duda:

    Imagina que mi tabla no tiene la misma estructura que el fichero del que quiero realizar la importación, por ejemplo que tenga muchos menos campos y en otro orden.

    ¿Cómo podría especificarle al BULK INSERT qué columna del fichero corresponde a qué campo de la tabla en la base de datos?

    Un saludo y muchas gracias de antemano

  2. […] Importación de archivos CSV con el comando Bulk Insert […]

  3. Pedro dice:

    Hola muy buena la info, tengo una consulta en mi archivo csv tengo un campo descripción el cual posee el siguiente texto “luces, lamparas”. Forman parte de la misma columna pero como en el medio tiene una coma me lo transforma en 2 columnas. Como puedo salvar este problemas

    Muchas gracias!

  4. Gus dice:

    Excelente y muy claro!

Deja un comentario

Buscar