Importación masiva de datos mediante BULK INSERT u OPENROWSET(BULK...)

En este tema se proporciona información general sobre cómo utilizar la instrucción Transact-SQL BULK INSERT y la instrucción INSERT...SELECT * FROM OPENROWSET(BULK...) para importar de forma masiva datos desde un archivo de datos a una tabla de Microsoft SQL Server. También se describen las consideraciones relativas a la seguridad del uso de BULK INSERT y OPENROWSET(BULK…), así como el uso de estos métodos para una importación masiva desde un origen de datos remoto.

Nota

Cuando use BULK INSERT u OPENROWSET(BULK…), es importante comprender el modo en el que SQL Server 2005 y las versiones posteriores tratan la suplantación. Para obtener más información, vea la sección "Consideraciones relativas a la seguridad" más adelante en este tema.

Instrucción BULK INSERT

BULK INSERT carga datos de un archivo de datos a una tabla. Esta funcionalidad es parecida a la que ofrece la opción in del comando bcp, aunque el que lee el archivo de datos es el proceso de SQL Server. Para obtener una descripción de la sintaxis de BULK INSERT, vea BULK INSERT (Transact-SQL).

Ejemplos

Función OPENROWSET(BULK…)

Se tiene acceso al proveedor de conjuntos de filas BULK de OPENROWSET al llamar a la función OPENROWSET y especificar la opción BULK. La función OPENROWSET(BULK…) permite obtener acceso a datos remotos mediante la conexión a un origen de datos remoto como, por ejemplo, un archivo de datos, a través de un proveedor OLE DB.

Para realizar una importación masiva de datos, llame a OPENROWSET(BULK…) desde una cláusula SELECT…FROM en una instrucción INSERT. La sintaxis básica de una importación masiva de datos es:

INSERT ... SELECT * FROM OPENROWSET(BULK...)

Cuando se utiliza en una instrucción INSERT, OPENROWSET (VOLUMEN...) admite sugerencias de la tabla. Además de las sugerencias de tabla normales, como TABLOCK, la cláusula BULK puede aceptar las sugerencias de tablas especializadas siguientes: IGNORE_CONSTRAINTS (solo pasa por alto las restricciones CHECK), IGNORE_TRIGGERS, KEEPDEFAULTS y KEEPIDENTITY. Para obtener más información, vea Sugerencias de tabla (Transact-SQL).

Para obtener información acerca de los usos adicionales de la opción BULK, vea OPENROWSET (Transact-SQL).

Ejemplos

Consideraciones relativas a la seguridad

Si un usuario utiliza un inicio de sesión de SQL Server, se utilizará el perfil de seguridad de la cuenta de proceso de SQL Server. Por el contrario, si un usuario de SQL Server ha iniciado sesión mediante autenticación de Windows, el usuario solo puede leer los archivos a los que la cuenta de usuario tiene acceso, independientemente del perfil de seguridad del proceso de SQL Server.

Por ejemplo, imagine un usuario que ha iniciado sesión en una instancia de SQL Server mediante autenticación de Windows. Para que el usuario pueda utilizar BULK INSERT u OPENROWSET para importar datos de un archivo de datos a una tabla de SQL Server, la cuenta de usuario necesita acceso de lectura para el archivo de datos. Como el usuario dispone de acceso al archivo de datos, podrá importar datos del archivo a la tabla, aunque el proceso de SQL Server no tenga permiso de acceso al archivo. El usuario no tiene que conceder permiso de acceso a archivos al proceso de SQL Server.

Puede configurar SQL Server y Microsoft Windows para permitir que una instancia de SQL Server se conecte a otra instancia de SQL Server mediante el reenvío de las credenciales de un usuario de Windows autenticado. Esto se conoce como suplantación o delegación. Es importante entender cómo SQL Server 2005 y las versiones posteriores controlan la seguridad en la suplantación de usuarios al utilizar BULK INSERT u OPENROWSET. La suplantación de usuarios permite que el archivo de datos resida en un equipo diferente al del proceso de SQL Server o del usuario. Por ejemplo, si un usuario del Equipo_A tiene acceso a un archivo de datos del Equipo_B y la delegación de credenciales se ha establecido correctamente, el usuario puede conectarse a una instancia de SQL Server que se esté ejecutando en el Equipo_C, tener acceso al archivo de datos del Equipo_B y realizar una importación masiva de datos desde ese archivo a una tabla en el Equipo_C. Para obtener más información, vea Descripción de la suplantación.

Nota

La manera en que SQL Server 2005 y las versiones posteriores controlan el acceso a los archivos aborda un problema de seguridad que ya estaba presente en Microsoft SQL Server 2000 y versiones anteriores. Anteriormente, después de que el usuario se autenticaba, el acceso a los archivos externos se basaba en el perfil de seguridad del proceso de SQL Server. Si el proceso de SQL Server tenía acceso de lectura a un archivo y el usuario no tenía acceso al archivo pero era miembro del rol fijo de servidor bulkadmin, el usuario podía importar el archivo mediante BULK INSERT y tener acceso al contenido del mismo.

Importación masiva desde un archivo de datos remoto

Para utilizar BULK INSERT o INSERT...SELECT * FROM OPENROWSET(BULK...) con el fin de importar datos de forma masiva desde otro equipo, es preciso compartir el archivo de datos entre los dos equipos. Para especificar un archivo de datos compartido, utilice la convención de nomenclatura universal (UNC) para el nombre, que tiene la forma general de **\\nombreDeServidor\nombreDeRecursoCompartido\rutaDeAcceso\**nombreDeArchivo. Además, la cuenta utilizada para obtener acceso al archivo de datos debe tener los permisos necesarios para leer el archivo en el disco remoto.

Por ejemplo, la siguiente instrucción BULK INSERT realiza la importación masiva de datos en una tabla SalesOrderDetail de la base de datos AdventureWorks2008R2 desde un archivo de datos denominado newdata.txt. Este archivo de datos reside en una carpeta compartida llamada \dailyorders en un directorio compartido de red llamado salesforce de un sistema llamado computer2.

BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO

Nota

Esta restricción no se aplica a la utilidad bcp debido a que el cliente lee el archivo independientemente de SQL Server.