Sentencia BULK INSERT en Transact SQL

BULK INSERT es la sentencia DML que permite insertar registros en una tabla o vista desde un fichero externo, usualmente un fichero CSV.

La sintaxis es la siguiente:

BULK INSERT table
FROM rutaArchivo
WITH (OPTIONS)

Antes de realizar un BULK INSERT debemos atender las siguientes consideraciones:

  • La ruta y nombre del fichero deben de especificarse correctamente en el FROM para que la sentencia pueda tener acceso a su contenido.

  • El orden de los datos del fichero tendrá correlación a las columnas de la tabla o vista donde queremos insertar los registros. Esto pone de manifiesto la importancia de respetar la coherencia del número de columnas y el tipo de dato específico que pueden almacenar cada una.

  • El fichero ha de adaptarse a las restricciones implícitas con las que está definida la tabla o vista donde queremos realizar la inserción. Esto incluye campos con restricciones (NOT NULL, formatos explícitos) o campos con propiedad IDENTITY entre otras.

Parámetros

BULK INSERT permite añadir en la cláusula WITH una sería de opciones configurables a la hora de cargar un fichero. En esta sección nos centraremos en explicar brevemente aquellas más destacables:

  • FIRSTROW: permite especificar la fila por donde empezarán a cargarse los datos. Esta opción nos permite omitir registros.

  • LASTROW: permite especificar la fila que marcará el límite de carga, limitando el número de registros que queremos insertar.

  • FORMAT: Opcional, nos permite especificar el tipo de fichero que vamos a cargar.

  • KEEPIDENTITY: nos permite romper la propiedad IDENTITY de algún campo para forzar al sistema a guardar un valor específico.

  • MAXERRORS: permite especificar el número de errores necesarios que ocurran durante el proceso antes de que se detenga la carga de datos.

  • FIELDTERMINATOR: Específica el signo del fichero que delimita cada valor correspondiente a cada columna en la vista o tabla donde deseamos insertar.

  • ROWTERMINATOR: Específica el signo del fichero que delimita el fin de cada fila correspondiente a cada registro en la vista o tabla donde deseamos insertar.

Ejemplo

Para ilustrar el funcionamiento de la sentencia BULK INSERT, procedemos a utilizar de ejemplo el siguiente fichero CSV que hemos generado: bulkInsert.csv, cuyo contendido es el siguiente:

9;Paula;Jerez Castro;C/ Olivar 44;123777898
10;Jorge;Luso Otero;C/ General Aranaz 76;556814332

Queremos, por tanto, introducir estos nuevos valores a en la tabla Clientes. Para ello dejamos el script de ejecución:

BULK INSERT Clientes
FROM
    'C:\Users\user\Desktop\WEB\bulkInsert.csv'
WITH (
    FORMAT = 'CSV',
    FIELDTERMINATOR= ';',
    ROWTERMINATOR = '\n',
    KEEPIDENTITY,
    MAXERRORS = 2
    );

Como nuestra tabla Clientes está definida con una propiedad IDENTITY auto incremental 1 a 1 para el campo idClientes, necesitamos utilizar la opción KEEPIDENTITY para romper dicha propiedad y poder insertar los valores definidos en el fichero.

Una vez ejecutada la sentencia, comprobamos que los registros se han insertado correctamente en la tabla Clientes:

    SELECT idClientes,
           nombre,
           apellidos,
           direccion,
           cuenta
    FROM Clientes
    WHERE idClientes IN (9,10);
idClientes nombre apellidos direccion cuenta
9 Paula Jerez Castro C/ Olivar 44 123777898
10 Jorge Luso Otero C/ General Aranaz 76 556814332