Realizar operaciones de copia masiva

La característica de copia masiva de SQL Server admite la transferencia de grandes cantidades de datos a una tabla o vista de SQL Server o desde ella. Los datos también pueden transferirse especificando una instrucción SELECT. Los datos pueden moverse entre SQL Server y un archivo de datos del sistema operativo, como un archivo ASCII. El archivo de datos puede tener diferentes formatos; el formato para una copia masiva se define en un archivo de formato. Opcionalmente, los datos pueden cargarse en variables de programa y transferirse a SQL Server mediante funciones y métodos de copia masiva.

CodePlex tiene una aplicación de ejemplo que muestra esta característica; vea Ejemplos de motor de base de datos de SQL Server para obtener más information. Normalmente, una aplicación utiliza la copia masiva de una de las siguientes maneras:

  • Copia masiva de una tabla, una vista o el conjunto de resultados de una instrucción Transact-SQL a un archivo de datos donde los datos se almacenan en el mismo formato que la tabla o vista.

    Recibe el nombre de archivo de datos en modo nativo.

  • Copia masiva de una tabla, una vista o el conjunto de resultados de una instrucción Transact-SQL a un archivo de datos donde los datos se almacenan en un formato distinto al de la tabla o vista.

    En este caso, se crea un archivo de formato independiente que define las características (tipo de datos, posición, longitud, terminador, etc.) de cada columna cuando se almacena en el archivo de datos. Si todas las columnas se convierten a un formato de caracteres, el archivo resultante se denomina archivo de datos en modo de carácter.

  • Copia masiva de un archivo de datos a una tabla o vista.

    Si es necesario, se usa un archivo de formato para determinar el diseño del archivo de datos.

  • Carga de datos en variables de programa y, a continuación, importación de los datos en una tabla o vista mediante las funciones de copia masiva a fin de copiar de forma masiva una fila cada vez.

Los archivos de datos utilizados por las funciones de copia masiva no tienen que ser creados por otro programa de copia masiva. Cualquier otro sistema puede generar un archivo de datos y un archivo de formato según las definiciones de copia masiva; estos archivos pueden utilizarse posteriormente con un programa de copia masiva de SQL Server para importar datos en SQL Server. Por ejemplo, puede exportar datos de una hoja de cálculo a un archivo delimitado por tabuladores, generar un archivo de formato que describa el archivo delimitado por tabuladores y, a continuación, usar un programa de copia masiva para importar rápidamente los datos en SQL Server. Los archivos de datos generados por la copia masiva también pueden importarse en otras aplicaciones. Por ejemplo, puede usar las funciones de copia masiva para exportar datos de una tabla o vista a un archivo delimitado por tabuladores que, a su vez, puede cargarse en una hoja de cálculo.

Nota

A partir de SQL Server 2005, cuando se usa la utilidad bcp, el servidor notifica un error si se truncan los datos numéricos. En SQL Server 2000 y versiones anteriores solo se devolvía una advertencia. Esto puede causar problemas en aplicaciones existentes que pasan por alto la advertencia. Para evitar estos problemas, debe asegurarse de que los datos de entrada cuentan con valores correctos que no se truncarán, o debe seguir usando la versión SQL Server 2000 de bcp.

Los programadores que codifican aplicaciones para usar las funciones de copia masiva deben seguir las reglas generales para obtener un rendimiento adecuado de la copia masiva. Para obtener más información acerca de la compatibilidad con operaciones de copia masiva en SQL Server, vea Acerca de las operaciones de importación y exportación masivas.

Limitaciones y restricciones

Debe enlazarse un tipo definido por el usuario CLR (UDT) en forma de datos binarios. Aunque un archivo de formato especifique SQLCHAR como tipo de datos de una columna UDT de destino, la utilidad BCP considerará los datos como binarios.

No use SET FMTONLY OFF con operaciones de copia masiva. SET FMTONLY OFF puede hacer que la operación de copia masiva no se ejecute correctamente o genere resultados inesperados.

Proveedor OLE DB de SQL Server Native Client

El proveedor OLE DB de SQL Server Native Client implementa dos métodos para realizar operaciones de copia masiva con una base de datos de SQL Server. El primer método implica el uso de la interfaz IRowsetFastLoad en operaciones de copia masiva basadas en memoria; el segundo, implica el uso de la interfaz IBCPSession en operaciones de copia masiva basadas en archivos.

Usar operaciones de copia masiva basadas en memoria

El proveedor OLE DB de SQL Server Native Client implementa la interfaz IRowsetFastLoad para exponer la compatibilidad de las operaciones de copia masiva basadas en memoria de SQL Server. La interfaz IRowsetFastLoad implementa los métodos IRowsetFastLoad::Commit e IRowsetFastLoad::InsertRow.

Habilitar una sesión para IRowsetFastLoad

El consumidor notifica al proveedor OLE DB de SQL Server Native Client su necesidad de una copia masiva mediante el establecimiento de la propiedad SSPROP_ENABLEFASTLOAD de origen de datos específica del proveedor OLE DB de SQL Server Native Client en VARIANT_TRUE. Con la propiedad establecida en el origen de datos, el consumidor crea una sesión de proveedor OLE DB de SQL Server Native Client. La nueva sesión permite al consumidor obtener acceso a la interfaz IRowsetFastLoad.

Nota

Si se usa la interfaz IDataInitialize para inicializar el origen de datos, es necesario establecer la propiedad SSPROP_IRowsetFastLoad en el parámetro rgPropertySets del método IOpenRowset::OpenRowset; de lo contrario, la llamada al método OpenRowset devolverá E_NOINTERFACE.

Al habilitar una sesión para la copia masiva, se restringe la compatibilidad del proveedor OLE DB de SQL Server Native Client con las interfaces en la sesión. Una sesión habilitada para copia masiva solo expone las interfaces siguientes:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Para deshabilitar la creación de conjuntos de filas habilitados para copia masiva y revertir la sesión del proveedor OLE DB de SQL Server Native Client al procesamiento estándar, vuelva a establecer SSPROP_ENABLEFASTLOAD en VARIANT_FALSE.

Conjuntos de filas IRowsetFastLoad

Los conjuntos de filas de copia masiva del proveedor OLE DB de SQL Server Native Client son de solo escritura, pero exponen interfaces que permiten al consumidor determinar la estructura de una tabla de SQL Server. En un conjunto de filas del proveedor OLE DB de SQL Server Native Client habilitado para copia masiva se exponen las siguientes interfaces:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Las propiedades específicas del proveedor SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS y SSPROP_FASTLOADKEEPIDENTITY controlan el comportamiento de los conjuntos de filas de copia masiva de proveedor OLE DB de SQL Server Native Client. Las propiedades se especifican en el miembro rgProperties de un miembro de parámetro rgPropertySets de IOpenRowset.

Id. de propiedad

Descripción

SSPROP_FASTLOADKEEPIDENTITY

Columna: no

L/E: lectura/escritura

Tipo: VT_BOOL

Valor predeterminado: VARIANT_FALSE

Descripción: mantiene valores de identidad suministrados por el consumidor.

VARIANT_FALSE: SQL Server genera valores para una columna de identidad de la tabla de SQL Server. El proveedor OLE DB de SQL Server Native Client omite cualquier valor enlazado para la columna.

VARIANT_TRUE: el consumidor enlaza un descriptor de acceso que proporciona un valor para una columna de identidad de SQL Server. La propiedad de identidad no está disponible en las columnas que aceptan valores NULL, de modo que el consumidor proporciona un valor único en cada llamada a IRowsetFastLoad::Insert.

SSPROP_FASTLOADKEEPNULLS

Columna: no

L/E: lectura/escritura

Tipo: VT_BOOL

Valor predeterminado: VARIANT_FALSE

Descripción: mantiene NULL en las columnas con una restricción DEFAULT. Sólo afecta a las columnas SQL Server que aceptan valores NULL y tienen aplicada una restricción DEFAULT.

VARIANT_FALSE: SQL Server inserta el valor predeterminado de la columna cuando el consumidor del proveedor OLE DB de SQL Server Native Client inserta una fila que contiene NULL para la columna.

VARIANT_TRUE: SQL Server inserta el valor NULL como valor de columna cuando el consumidor del proveedor OLE DB de SQL Server Native Client inserta una fila que contiene NULL para la columna.

SSPROP_FASTLOADOPTIONS

Columna: no

L/E: lectura/escritura

Tipo: VT_BSTR

Valor predeterminado: ninguno

Descripción: esta propiedad es igual que la opción -h "sugerencia[,...n]" de la utilidad bcp. Las cadenas que se indican a continuación pueden utilizarse como opciones para la copia masiva de datos en una tabla.

ORDER(columna[ASC | DESC][,...n]): criterio de ordenación de los datos en el archivo de datos. El rendimiento de la copia masiva mejora si el archivo de datos que se carga se ordena según el índice clúster de la tabla.

ROWS_PER_BATCH = bb: número de filas de datos por lote (como bb). El servidor optimiza la carga masiva según el valor bb. De forma predeterminada, no se conoce el valor de ROWS_PER_BATCH.

KILOBYTES_PER_BATCH = cc: número de kilobytes (KB) de datos por lote (como cc). De forma predeterminada, no se conoce el valor de KILOBYTES_PER_BATCH.

TABLOCK: se obtiene un bloqueo de tabla durante la operación de copia masiva. Esta opción mejora notablemente el rendimiento ya que, al mantenerse el bloqueo solamente durante la operación de copia masiva, se reduce la contención en la tabla por bloqueo. Varios clientes pueden cargar una tabla simultáneamente si ésta no tiene índices y se especifica TABLOCK. De forma predeterminada, el comportamiento del bloqueo viene determinado por la opción table lock on bulk load.

CHECK_CONSTRAINTS: durante la operación de copia masiva se comprueban todas las restricciones de table_name. De forma predeterminada, se omiten las restricciones.

FIRE_TRIGGER: en SQL Server 2000, con los desencadenadores habilitados, el registro optimizado no era posible porque la lógica del desencadenador se basaba en registros. Durante una operación de importación masiva con los desencadenadores habilitados, se deshabilitaban todas las optimizaciones de registro masivo (incluidos los bloqueos BU).

Sin embargo, a partir de SQL Server 2005, SQL Server usa el control de versiones de fila en los desencadenadores y almacena las versiones de fila en el almacén de versiones, en tempdb. Por lo tanto, las optimizaciones de registro masivo están disponibles incluso si están habilitados los desencadenadores. Antes de realizar una importación masiva con un número elevado de filas y los desencadenadores habilitados, es posible que tenga que ampliar el tamaño de tempdb.

Usar operaciones de copia masiva basadas en archivos

El proveedor OLE DB de SQL Server Native Client implementa la interfaz IBCPSession para exponer la compatibilidad de las operaciones de copia masiva basadas en archivos de SQL Server. La interfaz IBCPSession implementa los métodos IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt e IBCPSession::BCPWriteFmt.

Controlador ODBC de SQL Server Native Client

El controlador ODBC de SQL Server Native Client mantiene la misma compatibilidad con las operaciones de copia masiva que formaban parte de las versiones anteriores del controlador ODBC de SQL Server. Para obtener información acerca de las operaciones de copia masiva con el controlador ODBC de SQL Server Native Client, vea Realizar operaciones de copia masiva (ODBC).