Copia masiva de variables de programa
Es posible realizar la copia masiva directamente desde variables de programa. Después de asignar variables para almacenar los datos de una fila y llamar a bcp_init para iniciar la copia masiva, llame a bcp_bind para que cada columna especifique la ubicación y el formato de la variable de programa que va a asociarse a la columna. Rellene de datos cada variable y, a continuación, llame a bcp_sendrow para enviar una fila de datos al servidor. Repita el proceso de rellenar las variables y llamar a bcp_sendrow hasta que todas las filas se hayan enviado al servidor y, a continuación, llame a bcp_done para especificar que se ha completado la operación.
El parámetro pData de bcp_bind contiene 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 sólo 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 de 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 cbIndicator y pData de bcp_bind.
bcp_bind admite tres métodos para lidiar con los datos de longitud variable:
Usar cbData con una sola variable de datos. Coloque la longitud de los datos en cbData. Cada vez que cambie la longitud de los datos que van a copiarse de forma masiva, llame a bcp_collen para restablecer cbData. Si se está usando 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 está usando uno de los otros dos métodos, especifique 0 para cbIndicator.
Usar punteros de terminador. Cargue el parámetro pTerm de bcp_bind con la dirección del patrón de bits que finaliza los datos. Si se está usando uno de los otros dos métodos, especifique NULL para pTerm.
Estos tres métodos pueden usarse en la misma llamada a bcp_bind, en cuyo caso se usa la especificación que hace que se copien menos datos.
El parámetro type de bcp_bind usa identificadores de tipo de datos de DB-Library, no identificadores de tipo de datos de ODBC. Los identificadores de tipo de datos de DB-Library se definen en sqlncli.h para utilizarse con la función bcp_bind de ODBC.
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 SQL_C_TYPE_TIMESTAMP de ODBC, de modo que debe usar SQLBindCol o SQLGetData para convertir datos SQL_TYPE_TIMESTAMP de ODBC en una variable SQL_C_CHAR. Si después usa bcp_bind con un parámetro type igual a SQLCHARACTER para enlazar la variable a una columna datetime de SQL Server, las funciones de copia masiva convierten la cláusula de escape de marca de tiempo de la variable de caracteres en el formato de fecha y hora adecuado.
En la tabla siguiente se muestran los tipos de datos que es recomendable usar en la asignación de un tipo de datos SQL de ODBC a un tipo de datos SQL Server.
Tipo de datos SQL de ODBC |
Tipo de datos C de ODBC |
Parámetro type de bcp_bind |
Tipo de datos SQL Server |
---|---|---|---|
SQL_CHAR |
SQL_C_CHAR |
SQLCHARACTER |
character char |
SQL_VARCHAR |
SQL_C_CHAR |
SQLCHARACTER |
varchar character varying char varying 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 cuenta con tipos de datos tinyint con signo, smallint sin signo ni int sin signo. Para impedir la pérdida de valores de datos al migrar estos tipos de datos, cree la tabla de SQL Server con el tipo de datos entero inmediatamente superior. Para impedir que los usuarios agreguen después valores que se encuentren fuera del intervalo permitido por el tipo de datos original, aplique una regla a la columna SQL Server para restringir los valores permitidos al intervalo admitido por el tipo de datos de origen inicial:
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 directamente los tipos de datos interval. No obstante, una aplicación puede almacenar secuencias de escape interval como cadenas de caracteres en una columna de caracteres de SQL Server. La aplicación puede leerlas para usarlas más tarde, pero no pueden usarse en instrucciones Transact-SQL.
Las funciones de copia masiva pueden utilizarse para cargar rápidamente en SQL Server datos leídos de 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 esas mismas variables de programa a una operación de copia masiva. Una llamada a SQLFetchScroll o SQLFetch captura una fila de datos del origen de datos ODBC en las variables de programa y una llamada a bcp_sendrow realiza una copia masiva de los datos de las variables de programa en SQL Server.
Una aplicación puede usar la función bcp_colptr siempre que sea necesario para cambiar la dirección de la variable de datos originalmente especificada en el parámetro pData de bcp_bind. Una aplicación puede usar la función bcp_collen siempre que sea necesario para cambiar la longitud de datos originalmente especificada en el parámetro cbData de bcp_bind.
No es posible leer datos de SQL Server en variables de programa utilizando la copia masiva; no existe una función como "bcp_readrow". Sólo pueden enviarse datos de la aplicación al servidor.