Sei sulla pagina 1di 10

Importacin de archivos CSV con el

comando Bulk Insert


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
9
10
11
12
13
14
15
BULK INSERT
[ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]
FROM 'data_file'
[ WITH
(
[ [ , ] BATCHSIZE = batch_size ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ [ , ] DATAFILETYPE =
{ 'char' | 'native'| 'widechar' | 'widenative' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
16
17
18
19
20
21
22
23
24
25
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] LASTROW = last_row ]
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] TABLOCK ]
[ [ , ] ERRORFILE = 'file_name' ]
)]
Pero para efectos prcticos solo utilizaremos la siguiente estructura:
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
6
7
CREATE TABLE [database_name].[cliente](
[nombre] [varchar](30) NULL,
[rut] [varchar](10) NULL,
[telefono] [varchar](10) NULL
) ON [PRIMARY]

GO
Archivo Formato (cliente.ftm)
10.0
3
1 SQLCHAR 0
2 SQLCHAR 0
3 SQLCHAR 0

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

CREATE PROCEDURE [dbo].[SpCargaMasiva]
@Archivo varchar(255),
@Formato varchar(255),
@Tabla varchar(150)
AS
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
BEGIN TRY
declare @Sql nvarchar(1000);
declare @FilasDevueltas bigint;

SET NOCOUNT OFF;

set @Sql='TRUNCATE TABLE ' + @Tabla
EXECUTE sp_executesql @Sql;

set @Sql = 'BULK INSERT ' + @Tabla +
' FROM ' + CHAR(39) + @Archivo + CHAR(39) +
' WITH (FORMATFILE = ' + CHAR(39) + @Formato + CHAR(39) +
',BATCHSIZE =1000)'

EXECUTE sp_executesql @Sql;

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.

Potrebbero piacerti anche