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.