Copia masiva de variables de programa
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics 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 | text |
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.