Realizar operaciones de copia masiva en SQL Server Native Client

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Importante

SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). No se recomienda SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft heredado para SQL Server (SQLOLEDB) para el desarrollo de nuevas aplicaciones. Cambie al nuevo controlador OLE DB de Microsoft (MSOLEDBSQL) para SQL Server o al controlador ODBC de Microsoft ODBC Driver for SQL Server más reciente de ahora en adelante. Para SQLNCLI que se incluye como componente de motor de base de datos de SQL Server (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.

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.

Para obtener una aplicación de ejemplo que muestra esta característica, consulte Copia de datos masiva con IRowsetFastLoad (OLE DB).

Normalmente, una aplicación utiliza la copia masiva de una de las siguientes formas:

  • 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.

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 sobre operaciones de carga masiva en SQL Server, consulte Importar y exportar datos de forma masiva (SQL Server).

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 con 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 de su necesidad de copia masiva estableciendo la propiedad de origen de datos específica del proveedor OLE DB de SQL Server Native Client SSPROP_ENABLEFASTLOAD 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 acceder 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.

La habilitación de una sesión para la copia masiva restringe la compatibilidad del proveedor OLE DB de SQL Server Native Client para 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 hacer que la sesión del proveedor OLE DB de SQL Server Native Client revierta al procesamiento estándar, restablezca SSPROP_ENABLEFASTLOAD a 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. Las interfaces siguientes se exponen en un conjunto de filas de proveedor OLE DB de SQL Server Native Client habilitado para copia masiva:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Las propiedades específicas del proveedor SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS y comportamientos de control de SSPROP_FASTLOADKEEPIDENTITY de un conjunto de filas de copia masiva del proveedor OLE DB de SQL Server Native Client. Las propiedades se especifican en el miembro rgProperties de un miembro de parámetro rgPropertySetsIOpenRowset.

Id. de propiedad Descripción
SSPROP_FASTLOADKEEPIDENTITY Columna: No

R (lectura) y W (escritura): Lectura/escritura

Escriba: VT_BOOL

Valor predeterminado: VARIANT_FALSE

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

VARIANT_FALSE: Los valores para una columna de identidad de la tabla SQL Server se generan por 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, por lo que el consumidor proporciona un valor único en cada llamada a IRowsetFastLoad::Insert.
SSPROP_FASTLOADKEEPNULLS Columna: No

R (lectura) y W (escritura): Lectura/escritura

Escriba: VT_BOOL

Valor predeterminado: VARIANT_FALSE

Descripción: Mantiene NULL en las columnas con una restricción DEFAULT. Solo 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 para la columna cuando el consumidor ole DB de SQL Server Native Client inserta una fila que contiene NULL para la columna.

VARIANT_TRUE: SQL Server inserta NULL para el 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

R (lectura) y W (escritura): Lectura/escritura

Escriba: VT_BSTR

Valor predeterminado: ninguno

Descripción: Esta propiedad es la misma que la opción -h "hint[,...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]): Ordenar 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, el valor de ROWS_PER_BATCH es desconocido.

KILOBYTES_PER_BATCH = cc: Número de kilobytes (KB) de datos por lote (como cc). De forma predeterminada, el valor de KILOBYTES_PER_BATCH es desconocido.

TABLOCK: Se adquiere un bloqueo de nivel 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 de forma simultánea si esta no tiene índices y se especifica TABLOCK. De forma predeterminada, el comportamiento del bloqueo viene determinado por la opción de tabla 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: SQL Server usa las versiones de fila para 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 de un lote con un número elevado de filas y los desencadenadores habilitados, puede 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 con las operaciones de copia masiva basadas en archivos de SQL Server. La interfaz IBCPSession implementa IBCPSession ::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt e IBCPSession::BCPWriteFmt métodos.

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 versiones anteriores del controlador ODBC de SQL Server. Para obtener información sobre las operaciones de copia masiva mediante el controlador ODBC de SQL Server Native Client, vea Realizar operaciones de copia masiva (ODBC).

Consulte también

Características de SQL Server Native Client
Propiedades de orígenes de datos (OLE DB)
Importar y exportar datos de forma masiva (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
Optimizar el rendimiento de una importación en bloque