Una de las herramientas más viejas de SQL Server, es la utilería BCP y es considerada por muchos una de las más rápidas y fáciles de utilizar. Veamos cuales son sus ventajas y desventajas, así como los permisos necesarios para su ejecución.

BCP significa Bulk Copy Program y debido a que es un programa, es ejecutados desde fuera del manejador de base de datos, es decir desde la línea de comandos y es utilizado para insertar registros en la base de datos o extraerlos.

Existen dos limitaciones que debemos considerar cuando utilicemos esta utilería:

  •  Tiene capacidades limitadas para transformar los datos, es decir si los datos que necesitamos insertar en la base de datos necesitan pasar por alguna transformación compleja o validación, BCP no es la herramienta correcta.
  •  Tiene capacidades limitadas para el manejor de errores, es decir que la herramienta puede reconocer que un error ocurrió mientras se encontraba cargando información, pero tiene acciones limitadas para reaccionar contra ese error, como lo haría SSIS.

Esta es la sintaxis para la utilera de BCP

bcp {[[database_name.][owner].]{table_name | view_name} | "query"}
    {in | out | queryout | format} data_file
    [-mmax_errors] [-fformat_file] [-x] [-eerr_file]
    [-Ffirst_row] [-Llast_row] [-bbatch_size]
    [-n] [-c] [-N] [-w] [-V (60 | 65 | 70 | 80)] [-6]
    [-q] [-C { ACP | OEM | RAW | code_page } ] [-tfield_term]
    [-rrow_term] [-iinput_file] [-ooutput_file] [-apacket_size]
    [-Sserver_name[\instance_name]] [-Ulogin_id] [-Ppassword]
    [-T] [-v] [-R] [-k] [-E] [-h"hint [,...n]"]


Existen muchos parámetros que pueden ser utilizados, pero los más importantes son los siguientes:

-t "t"erminator, define el delimitador de columnas. El valor por defaul es \t (tabuladores). Si piensas utilizar archivos csv, este es el parámetro que debes de utilizar.

-r "r"ow delimiter o "r"ow terminator, define el valor por el cual cada registro va a estar separado. El valor de default es \n (newline character).

-F "F"irst row to import, define el número de registro por el cuál se va a comenzar a insertar la información, generalmente este se utiliza cuando el archivo tiene encabezados y es necesario comenzar desde el segundo registro, o cuando es necesario reprocesar desde un registro en especial.

El parámetro de Hint

 Este parámetro tiene un impacto en el desempeño del BCP, ya que especifica ciertas sugerencias a utilizar durante la carga de un archivo, entro en los más importantes existen TABLELOCK y ORDER que son utilizados para mejorar el rendimiento de la carga.

TABLELOCK se utiliza para decirle al BCP que utilice un bloqueo de tabla mientras se encuentra cargando la información, esto decrece el overhead que generan los bloqueos y permiten que el tipo de recuperación bulk-logged haga poco uso del log de transacciones.
ORDER, le dice al BCP que los registros en el archivo se encuentran ordenados por ciertas columnas. Si estas hacen match con el orden del índice clustered, el rendimiento de la carga de va a ver beneficiado, si no hacen match este parámetro va a ser ignorado.

Algo importante que debemos tomar en cuenta es que el parámetro de hint solo se utiliza para insertar información en la base de datos, de lo contrario es ignorado.

Permisos para ejecutar el comando BCP

Los mínimos permisos necesarios para poder insertar registros en la base de datos por medio del BCP son de SELECT e INSERT, ya que a diferencia de la versión SQL Server 2000, en la versión 2005 ahora es necesario que el usuario tenga permisos de ALTER TABLE, para poder deshabilitar la ejecución de triggers, de  validación de constraints o para poder utilizar la función KEEPIDENTITY.

Por ejemplo:

bcp tabla1 in c:\test.txt -T -c

El parámetro -T indica que se va a hacer una conexión de confianza, lo que significa que va a ser ejecutado con los permisos asignados al usuario de red, en este caso el usuario debe de tener permisos de SELECT/INSERT en tabla1 ya que son los mínimos privilegios para insertar registros, pero también necesita permisos de ALTER TABLE, ya que por default el BCP deshabilita los triggers y constraints.

Si el comando fuera ejecutado utilizando los hints de CHECK_CONSTRAINTS y FIRE_TRIGGERS, ya no sería necesario el permiso de ALTER TABLE.

En conclusión podemos decir que solo son necesarios los permisos de ALTER TABLE cuando usamos la opción -E para insertar valores identity y cuando no se indican los parámetros CHECK_CONSTRAINTS y FIRE_TRIGGERS

 

You are not authorised to post comments.

Comments powered by CComment

DBASupport - Foro

Mirroring con estados disconnected
Hola, el día de hoy después de reiniciar mi servidor de destino a donde realizo el mirroring ya no pude replicar más, el error que muestra es que...

Se me duplica el mensaje en /etc/motd
  • Topic started by agamez
  • in General
  • 3 years ago.
  • 3 years ago.
  • 2 replies
Buen día, alguien tiene idea porque después de actualizar a fedora 28 se me esta duplicando la salida de mi /etc/motd?

Cómo puedo filtrar un mensaje en el log messages
Buenos días, estoy recibiendo en mi log de errores muchos mensajes de cron, ya que tengo varios crones configurados en mi server. Existe alguna...

Cómo validar la hora de ejecución de un proceso
Hola, estoy tratando de validar que un proceso sólo pueda ser ejecutado dentro de un periodo de tiempo, en este caso entre las 7:00 AM y las 7:00...

Estadisticas en la base de datos
Buenos días, estoy teniendo problemas de performance en mis queries y quisiera saber como puedo validar que mis tablas tienen las estadisticas...
URGE AYUDA
  • Topic started by
  • in General
  • 15 years ago.
  • 15 years ago.
  • 30 replies
HOLA ESPERO ME PUEDAN AYUDAR. TEN GO UNA TABLA CON una estructura similar a la siguiente: id_mov cargo subtotal total...

Duada de Memoria de SQL Server 2005
  • Topic started by Erzengel
  • in General
  • 11 years ago.
  • 11 years ago.
  • 30 replies
Buen Día Recurro nuevamente a su sabiduría. Quiero saber el porque tiene un tope SQL Serever de 2GB en Windows server 2003 de 32 bit y si alguien...

SqlDateTime overflow
  • Topic started by
  • in General
  • 15 years ago.
  • 15 years ago.
  • 11 replies
Alguno de ustedes ha tenido este problema: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.' Les...

problemas para iniciar el agente sql
  • Topic started by acgch
  • in General
  • 14 years ago.
  • 14 years ago.
  • 11 replies
Recientemente para asegurar el sql server 2005, cree una cuenta sql con derechos de sysadmin y borre el grupo BUILTIN\Administradores para evitar...

Problemas para levantar mirror
  • Topic started by acgch
  • in General
  • 14 years ago.
  • 14 years ago.
  • 16 replies
Hola amigos, tengan un buen día, les comento que estoy configurando mirror siguiendo los pasos a través del wizard del managment studio y también...
Mirroring con estados disconnected
Hola, el día de hoy después de reiniciar mi servidor de destino a donde realizo el mirroring ya no pude replicar más, el error que muestra es que...

Se me duplica el mensaje en /etc/motd
  • Topic started by agamez
  • in General
  • 3 years ago.
  • 3 years ago.
  • 2 replies
Buen día, alguien tiene idea porque después de actualizar a fedora 28 se me esta duplicando la salida de mi /etc/motd?

Cómo puedo filtrar un mensaje en el log messages
Buenos días, estoy recibiendo en mi log de errores muchos mensajes de cron, ya que tengo varios crones configurados en mi server. Existe alguna...

Cómo validar la hora de ejecución de un proceso
Hola, estoy tratando de validar que un proceso sólo pueda ser ejecutado dentro de un periodo de tiempo, en este caso entre las 7:00 AM y las 7:00...

Estadisticas en la base de datos
Buenos días, estoy teniendo problemas de performance en mis queries y quisiera saber como puedo validar que mis tablas tienen las estadisticas...
Deshabilitar todos los jobs
  • Topic started by agamez
  • in Jobs
  • 4 years ago.
  • 4 years ago.
  • 1 reply
Buenos días, alguien sabe como puedo deshabilitar rapidamente todos los jobs de SQL Server, gracias.

Mirroring con estados disconnected
Hola, el día de hoy después de reiniciar mi servidor de destino a donde realizo el mirroring ya no pude replicar más, el error que muestra es que...

Se me duplica el mensaje en /etc/motd
  • Topic started by agamez
  • in General
  • 3 years ago.
  • 3 years ago.
  • 2 replies
Buen día, alguien tiene idea porque después de actualizar a fedora 28 se me esta duplicando la salida de mi /etc/motd?

Cómo puedo filtrar un mensaje en el log messages
Buenos días, estoy recibiendo en mi log de errores muchos mensajes de cron, ya que tengo varios crones configurados en mi server. Existe alguna...

Cómo validar la hora de ejecución de un proceso
Hola, estoy tratando de validar que un proceso sólo pueda ser ejecutado dentro de un periodo de tiempo, en este caso entre las 7:00 AM y las 7:00...