Copia bulk da variabili di programma
È possibile eseguire una copia bulk direttamente dalle variabili di programma. Dopo avere allocato le variabili in modo da contenere i dati di una riga e avere chiamato bcp_init per avviare la copia bulk, chiamare bcp_bind per ogni colonna per specificare il percorso e il formato della variabile di programma da associare alla colonna. Completare ogni variabile con i dati, quindi chiamare bcp_sendrow per inviare una riga di dati al server. Ripetere il processo di inserimento dei dati nelle variabili chiamando bcp_sendrow finché non vengono inviate al server tutte le righe, quindi chiamare bcp_done per specificare il completamento dell'operazione.
Il parametro pData di bcp_bind contiene l'indirizzo della variabile da associare alla colonna. I dati di ogni colonna possono essere archiviati in due modi:
Allocando una variabile in modo da contenere i dati.
Allocando una variabile indicatore seguita immediatamente dalla variabile dati.
La variabile indicatore indica la lunghezza dei dati per le colonne a lunghezza variabile e indica inoltre i valori NULL se la colonna ammette valori NULL. Se viene utilizzata solo una variabile dati, l'indirizzo di questa variabile verrà archiviato nel parametro pData di bcp_bind. Se viene utilizzata una variabile indicatore, l'indirizzo della variabile indicatore verrà archiviato nel parametro pData di bcp_bind. Le funzioni di copia bulk calcolano il percorso della variabile dati aggiungendo i parametri cbIndicator e pData di bcp_bind.
bcp_bind supporta tre metodi per la gestione dei dati a lunghezza variabile:
Utilizzare cbData solo con una variabile dati. Inserire la lunghezza dei dati in cbData. Ogni volta che viene modificata la lunghezza dei dati di cui eseguire la copia bulk, chiamare bcp_collenper reimpostare cbData. Se viene utilizzato uno degli altri due metodi, specificare SQL_VARLEN_DATA per cbData. Se tutti i valori dei dati forniti per una colonna sono NULL, specificare SQL_NULL_DATA per cbData.
Utilizzare variabili indicatore. Non appena un nuovo valore dei dati viene spostato nella variabile dati, archiviare la lunghezza del valore nella variabile indicatore. Se viene utilizzato uno degli altri due metodi, specificare 0 per cbIndicator.
Utilizzare i puntatori ai caratteri di terminazione. Caricare il parametro pTerm di bcp_bind con l'indirizzo dello schema di bit che termina i dati. Se viene utilizzato uno degli altri due metodi, specificare NULL per pTerm.
È possibile utilizzare tutti e tre i metodi nella stessa chiamata bcp_bind. In tal caso viene utilizzata la specifica che comporta la copia del minor numero di dati.
Il parametro type di bcp_bind utilizza gli identificatori dei tipi di dati DB-Library, non gli identificatori dei tipi di dati ODBC. Gli identificatori dei tipi di dati DB-Library vengono definiti in sqlncli.h per l'utilizzo con la funzione ODBC bcp_bind.
Le funzioni di copia bulk non supportano tutti i tipi di dati C ODBC. Ad esempio, le funzioni di copia bulk non supportano la struttura ODBC SQL_C_TYPE_TIMESTAMP. Utilizzare quindi SQLBindCol o SQLGetData per convertire i dati ODBC SQL_TYPE_TIMESTAMP in una variabile SQL_C_CHAR. Se si utilizza quindi bcp_bind con un parametro type di SQLCHARACTER per associare la variabile a una colonna di tipo datetime di SQL Server, le funzioni di copia bulk convertono la clausola di escape del timestamp nella variabile carattere nel formato datetime appropriato.
Nella tabella seguente vengono elencati i tipi di dati consigliati da utilizzare nel mapping da un tipo di dati SQL ODBC a un tipo di dati SQL Server.
Tipo di dati SQL ODBC |
Tipo di dati C ODBC |
Parametro type di bcp_bind |
Tipo di dati 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 segno) |
SQL_C_SSHORT |
SQLINT2 |
smallint |
SQL_TINYINT (senza segno) |
SQL_C_UTINYINT |
SQLINT1 |
tinyint |
SQL_SMALL_INT (con segno) |
SQL_C_SSHORT |
SQLINT2 |
smallint |
SQL_SMALL_INT (senza segno) |
SQL_C_SLONG |
SQLINT4 |
int integer |
SQL_INTEGER (con segno) |
SQL_C_SLONG |
SQLINT4 |
int integer |
SQL_INTEGER (senza segno) |
SQL_C_CHAR |
SQLCHARACTER |
decimal dec |
SQL_BIGINT (con segno e senza segno) |
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 non dispone dei tipi di dati tinyint con segno, smallint senza segno o int senza segno. Per evitare la perdita di valori dei dati quando si esegue la migrazione di questi tipi di dati, creare la tabella SQL Server con il tipo di dati integer successivo più grande. Per impedire agli utenti di aggiungere in un secondo momento valori non compresi nell'intervallo consentito dal tipo di dati originale, applicare una regola alla colonna SQL Server per limitare i valori consentiti all'intervallo supportato dal tipo di dati originale:
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 non supporta direttamente i tipi di dati intervallo. Tuttavia, un'applicazione può archiviare le sequenze di escape dell'intervallo come stringhe di caratteri in una colonna SQL Server di tipo carattere. Tali valori potranno essere letti dall'applicazione per un utilizzo futuro ma non potranno essere utilizzati nelle istruzioni Transact-SQL.
Le funzioni di copia bulk possono essere utilizzate per caricare rapidamente i dati in SQL Server letti da un'origine dati ODBC. Utilizzare SQLBindCol per associare le colonne di un set di risultati alle variabili di programma, quindi utilizzare bcp_bind per associare le stesse variabili di programma a un'operazione di copia bulk. Chiamare SQLFetchScroll o SQLFetch per recuperare una riga di dati dall'origine dati ODBC nelle variabili di programma e chiamare bcp_sendrow per eseguire la copia bulk dei dati dalle variabili di programma in SQL Server.
Un'applicazione può utilizzare la funzione bcp_colptr ogni volta che è necessario modificare l'indirizzo della variabile dati specificato originariamente nel parametropData di bcp_bind. Un'applicazione può utilizzare la funzione bcp_collen ogni volta che è necessario modificare la lunghezza dei dati specificata originariamente nel parametrocbData di bcp_bind.
Non è possibile leggere i dati da SQL Server nelle variabili di programma utilizzando la copia bulk. Non esiste una funzione simile a "bcp_readrow". È possibile solo inviare i dati dall'applicazione al server.