Copia masiva de variables de programa

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

Es posible realizar la copia masiva directamente desde variables de programa. Después de asignar variables para contener los datos de una fila y llamar a bcp_init para iniciar la copia masiva, llame a bcp_bind para cada columna para especificar la ubicación y el formato de la variable de programa que se va a asociar a la columna. Rellene cada variable con datos y llame a bcp_sendrow para enviar una fila de datos al servidor. Repita el proceso de rellenar las variables y llame a bcp_sendrow hasta que se hayan enviado todas las filas al servidor y, a continuación, llame a bcp_done para especificar que se complete la operación.

El parámetro pData de bcp_bindcontiene la dirección de la variable que se enlaza a la columna. Los datos de cada columna pueden almacenarse de una de estas dos formas:

  • Asignando una variable para almacenar los datos.

  • Asignando una variable de indicador inmediatamente seguida de la variable de datos.

La variable de indicador indica la longitud de los datos para las columnas de longitud variable y también indica los valores NULL, si la columna permite valores NULL. Si solo se usa una variable de datos, la dirección de esta variable se almacena en el parámetro pData de bcp_bind. Si se usa una variable de indicador, la dirección de la variable indicador se almacena en el parámetro pData de bcp_bind. Las funciones de copia masiva calculan la ubicación de la variable de datos agregando los parámetros bcp_bindcbIndicator y pData .

bcp_bind admite tres métodos para tratar datos de longitud variable:

  • Use cbData solo con una variable de datos. Coloque la longitud de los datos en cbData. Cada vez que la longitud de los datos que se van a copiar masivamente cambia, llame a bcp_collen para restablecer cbData. Si se usa uno de los otros dos métodos, especifique SQL_VARLEN_DATA para cbData. Si todos los valores de datos que se proporcionan para una columna son NULL, especifique SQL_NULL_DATA para cbData.

  • Usar variables de indicador. A medida que cada nuevo valor de datos se pase a la variable de datos, almacene la longitud del valor en la variable de indicador. Si se usa uno de los otros dos métodos, especifique 0 para cbIndicator.

  • Usar punteros de terminador. Cargue el parámetro bcp_bindpTerm con la dirección del patrón de bits que finaliza los datos. Si se usa uno de los otros dos métodos, especifique NULL para pTerm.

Los tres métodos se pueden usar en la misma llamada bcp_bind , en cuyo caso se usa la especificación que da como resultado la menor cantidad de datos que se copian.

El parámetro de tipo bcp_bindusa identificadores de tipo de datos db-Library, no identificadores de tipo de datos ODBC. Los identificadores de tipo de datos db-Library se definen en sqlncli.h para su uso con la función odbc bcp_bind .

Las funciones de copia masiva no admiten todos los tipos de datos C de ODBC. Por ejemplo, las funciones de copia masiva no admiten la estructura de SQL_C_TYPE_TIMESTAMP ODBC, por lo que use SQLBindCol o SQLGetData para convertir datos odbc SQL_TYPE_TIMESTAMP en una variable de SQL_C_CHAR. Si después usa bcp_bind con un parámetro de tipo de SQLCHARACTER para enlazar la variable a una columna datetime de SQL Server, las funciones de copia masiva convierten la cláusula de escape timestamp en la variable de caracteres al formato datetime adecuado.

En la tabla siguiente se enumeran los tipos de datos recomendados que se usarán en la asignación de un tipo de datos SQL ODBC a un tipo de datos de SQL Server.

Tipo de datos SQL de ODBC Tipo de datos C de ODBC parámetro de tipo bcp_bind Tipos de datos de SQL Server
SQL_CHAR SQL_C_CHAR SQLCHARACTER carácter

char
SQL_VARCHAR SQL_C_CHAR SQLCHARACTER varchar

variación de carácter

variación car

sysname
SQL_LONGVARCHAR SQL_C_CHAR SQLCHARACTER texto
SQL_WCHAR SQL_C_WCHAR SQLNCHAR nchar
SQL_WVARCHAR SQL_C_WCHAR SQLNVARCHAR nvarchar
SQL_WLONGVARCHAR SQL_C_WCHAR SQLNTEXT ntext
SQL_DECIMAL SQL_C_CHAR SQLCHARACTER decimal

dec

money

smallmoney
SQL_NUMERIC SQL_C_NUMERIC SQLNUMERICN numeric
SQL_BIT SQL_C_BIT SQLBIT bit
SQL_TINYINT (con signo) SQL_C_SSHORT SQLINT2 smallint
SQL_TINYINT (sin signo) SQL_C_UTINYINT SQLINT1 tinyint
SQL_SMALL_INT (con signo) SQL_C_SSHORT SQLINT2 smallint
SQL_SMALL_INT (sin signo) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (con signo) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (sin signo) SQL_C_CHAR SQLCHARACTER decimal

dec
SQL_BIGINT (con signo y sin signo) SQL_C_CHAR SQLCHARACTER bigint
SQL_REAL SQL_C_FLOAT SQLFLT4 real
SQL_FLOAT SQL_C_DOUBLE SQLFLT8 float
SQL_DOUBLE SQL_C_DOUBLE SQLFLT8 float
SQL_BINARY SQL_C_BINARY SQLBINARY binary

timestamp
SQL_VARBINARY SQL_C_BINARY SQLBINARY varbinary

binary varying
SQL_LONGVARBINARY SQL_C_BINARY SQLBINARY image
SQL_TYPE_DATE SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIME SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIMESTAMP SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_GUID SQL_C_GUID SQLUNIQUEID uniqueidentifier
SQL_INTERVAL_ SQL_C_CHAR SQLCHARACTER char

SQL Server no tiene tipos de datos tinyint, smallint sin signo o sin signo. Para evitar la pérdida de valores de datos al migrar estos tipos de datos, cree la tabla de SQL Server con el siguiente tipo de datos entero más grande. Para evitar que los usuarios agreguen valores fuera del intervalo permitido por el tipo de datos original, aplique una regla a la columna de SQL Server para restringir los valores permitidos al intervalo admitido por el tipo de datos en el origen original:

CREATE TABLE Sample_Ints(STinyIntCol   SMALLINT,  
USmallIntCol INT)  
GO  
CREATE RULE STinyInt_Rule  
AS   
@range >= -128 AND @range <= 127  
GO  
CREATE RULE USmallInt_Rule  
AS   
@range >= 0 AND @range <= 65535  
GO  
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'  
GO  
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'  
GO  

SQL Server no admite tipos de datos de intervalo directamente. Sin embargo, una aplicación puede almacenar secuencias de escape de intervalo como cadenas de caracteres en una columna de caracteres de SQL Server. La aplicación puede leerlas para su uso posterior, pero no se pueden usar en instrucciones Transact-SQL.

Las funciones de copia masiva se pueden usar para cargar rápidamente datos en SQL Server que se han leído desde un origen de datos ODBC. Use SQLBindCol para enlazar las columnas de un conjunto de resultados a variables de programa y, a continuación, use bcp_bind para enlazar las mismas variables de programa a una operación de copia masiva. Al llamar a SQLFetchScroll o SQLFetch , se captura una fila de datos del origen de datos ODBC en las variables de programa y se llama a bcp_sendrow copia masivamente los datos de las variables de programa en SQL Server .

Una aplicación puede usar la función bcp_colptr siempre que necesite cambiar la dirección de la variable de datos especificada originalmente en el parámetro pData de bcp_bind. Una aplicación puede usar la función bcp_collen en cualquier momento que necesite cambiar la longitud de datos especificada originalmente en el parámetro bcp_bindcbData .

No se pueden leer datos de SQL Server en variables de programa mediante copia masiva; no hay nada como una función "bcp_readrow". Solo pueden enviarse datos de la aplicación al servidor.

Consulte también

Realizar operaciones de copia masiva (ODBC)