En ms de una ocasin nos fue necesario importar datos en formato CSV a una tabla en nuestro servidor de base de datos SQL Server, despus 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 operacin. Antes que nada debemos suponer que poseemos la siguiente tabla:
El siguiente archivo CSV: view source print? 1 1,Cabecera1,20001211,20001211 22:10:30,41422.66, 22.22 2 2,Cabecera2,20001212,20001212 22:10:32,1234567.123456, 22.4444 Y la clara intencin de copiar la informacin desde el archivo CSV hacia la tabla en cuestin. Deberemos entonces utilizar el siguiente comando: view source print? 1 BULK INSERT 2 Cabecera 3 FROM 4 'C:\....\archivo.csv' 5 WITH ( 6 FIELDTERMINATOR= ',', 7 ROWTERMINATOR = '\n' 8 );
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 operacin generar el siguiente resultado:
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 algn error de conversin de datos durante la importacin 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, violacin de la constraint UNIQUE, la importacin fallar, cabe mencionar que para el caso particular de las constraints CHECK y FOREIGN KEY, las mismas sern por defecto omitidas, al menos que se utilice el parmetro CHECK_CONSTRAINTS en la sentencia BULK INSERT para especificar lo contrario. El comando BULK INSERT posee adems de los pocos parmetros 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 dispararn los triggers de las tablas durante la importacin de datos, KEEPIDENTITY que permite especificar de qu manera se manejarn la columnas identity durante la importacin y KEEPNULLS que indica si las columnas vacas debern conservar el valor NULL. Dejo para quien este interesado el siguiente link donde podrn obtener ms informacin del comando, de todos los argumentos disponibles (que son muchos ms que los que hemos mencionado) y de su uso:
SQL BULK Insert is a common question when it comes to importing CSV file using SQL Server T-SQL Bulk Insert command. However if you need flexibility, more control and you can use SSIS (SQL Server Integration Services) than I suggest to read this article instead SSIS create a package otherwise let's conitnue our tutorial. For the purpose of this tutorial I will use SQL Server 2008 R2 but it might also work in 2005, 2008 and 2012 versions.
Below is screenshot of Employee table that I will use to insert using SQL bulk insert rows from CSV file.
SQL Bulk Insert CSV File In this tutorial we will use very simple CSV file that will contain Employee information. See below screenshot of EmployeeBulkInsert.csv file. You can also download SQL Bulk Insert CSV File
The CSV file will be loaded from C:\ location so I will use C:\EmployeeBulkImport.csv to import the CSV file. SQL Bulk Insert example I will now show you how to use SQL Bulk Insert command to import this very simple CSV file.
BULK INSERT dbo.Employee FROM 'c:\EmployeeBulkInsert.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' )
Below is screenshot with command and results
Como realizar carga masiva de archivos con Sql Server 2008 R2 (Bulk Insert) Publicado en septiembre 10, 2013 por Victor Riquelme Sin Comentarios A continuacin describiremos como realizar una carga masiva directamente desde sql server a travs de un procedimiento almacenado (SP). Para este procedimiento utilizaremos una funcin de sql server llamada Bulk Insert cuya sintaxis es la siguiente: BULK INSERT [ database_name . [ schema_ FROM 'data_file' [ WITH (
1 2 3 4 5 6 7 8 BULK INSERT [ database_name . [ schema_name ] FROM 'data_file' [ WITH ( [ BATCHSIZE = batch_size ] [ [ , ] FORMATFILE = 'format_file_path' ] )] Para este proceso debemos tener un archivo de formato, nuestro archivo de carga y obviamente nuestra tabla de destino. Para este ejemplo utilizaremos los siguiente: Tabla cliente CREATE TABLE [database_nam [nombre] [varchar](30 [rut] [varchar](10) NU [telefono] [varchar](10 ) ON [PRIMARY]
1 2 3 4 5 10.0 3 1 SQLCHAR 0 30 "" 1 nombre SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 10 "" 2 rut SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 10 "\r\n" 3 telefono SQL_Latin1_General_CP1_CI_AS Los nombres y largos de los campos deben coincidir con los de la base de datos. Si lo dejamos as separara el archivo por cantidad de caracteres si lo quieren por delimitadores se deben agregar en (ejemplo ;). La ultima fila debe llevar siempre \r\n 10.0 Corresponde a la versin utilizada por sql server 3 Corresponde a la cantidad de filas Archivo de Carga (cliente_masivo.txt) Pedro Juan Lopez Ortega 11 Pedro Juan Lopez Ortega 11 Pedro Juan Lopez Ortega 11 Pedro Juan Lopez Ortega 11 Pedro Juan Lopez Ortega 11
1 2 3 4 5 6 Pedro Juan Lopez Ortega 11111111-80991234567 Pedro Juan Lopez Ortega 11111111-80991234567 Pedro Juan Lopez Ortega 11111111-80991234567 Pedro Juan Lopez Ortega 11111111-80991234567 Pedro Juan Lopez Ortega 11111111-80991234567 ..... Bueno con estos datos estamos listos para realizar nuestra carga de datos masivos. Para no alargar mas este tutorial les dejo el procedimiento almacenado y la forma de uso: USE [My DataBase] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON
1 2 3 4 5 6 7 8 9 10 11 12 USE [My DataBase] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
set @FilasDevueltas=@@ROWCOUNT; select @FilasDevueltas as FilasDevueltas;
END TRY BEGIN CATCH set @FilasDevueltas=-1; select @FilasDevueltas as FilasDevueltas;
END CATCH Al comienzo limpia la tabla (en caso que no necesiten limpiar solo borran esa parte). Controla algunos errores que puedan ocurrir retornando -1. Modo de uso: dbo.SpCargaMasiva 'C:\cliente.t
1 dbo.SpCargaMasiva 'C:\cliente.txt','C:\cliente.fmt','cliente' Si estn trabajando apuntando a algn servidor por ejemplo QUALITY deben cambiar la ruta C:\ por la correspondiente \\QUALITY\ Espero sea de su utilidad. No duden en dejar sus inquietudes o comentarios. Saludos.