Condividi tramite


Copia bulk da variabili di programma

È possibile eseguire una copia bulk direttamente dalle variabili di programma. Dopo aver allocato le variabili per contenere i dati per una riga e chiamando 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. Compilare ogni variabile con dati, quindi chiamare bcp_sendrow per inviare una riga di dati al server. Ripetere il processo di riempimento delle variabili e di chiamare bcp_sendrow fino a quando non vengono inviate tutte le righe al server, quindi chiamare bcp_done per specificare che l'operazione è stata completata.

Il parametro bcp_bindpData contiene l'indirizzo della variabile associata 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 usata solo una variabile di dati, l'indirizzo di questa variabile viene archiviato nel parametro bcp_bindpData . Se viene usata una variabile indicatore, l'indirizzo della variabile indicatore viene archiviato nel parametro bcp_bindpData . Le funzioni di copia bulk calcolano la posizione della variabile di dati aggiungendo i parametri bcp_bindcbIndicator e pData .

bcp_bind supporta tre metodi per gestire i dati a lunghezza variabile:

  • Usare cbData con solo una variabile di dati. Inserire la lunghezza dei dati in cbData. Ogni volta che la lunghezza dei dati da copiare in blocco cambia, chiamare bcp_collenper reimpostare cbData. Se viene usato uno degli altri due metodi, specificare SQL_VARLEN_DATA per cbData. Se tutti i valori di 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 usato uno degli altri due metodi, specificare 0 per cbIndicator.

  • Utilizzare i puntatori ai caratteri di terminazione. Caricare il parametro pTerm bcp_bindcon l'indirizzo del modello di bit che termina i dati. Se viene usato uno degli altri due metodi, specificare NULL per pTerm.

Tutti e tre questi metodi possono essere usati nella stessa chiamata bcp_bind , nel qual caso viene usata la specifica che determina la quantità minima di dati copiata.

Il parametro di tipo bcp_bindusa identificatori del tipo di dati della libreria DB, non identificatori del tipo di dati ODBC. Gli identificatori del tipo di dati della libreria DB sono definiti in sqlncli.h per l'uso 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 di SQL_C_TYPE_TIMESTAMP ODBC, quindi usare SQLBindCol o SQLGetData per convertire i dati odbc SQL_TYPE_TIMESTAMP in una variabile SQL_C_CHAR. Se quindi si usa bcp_bind con un parametro di tipo SQLCHARACTER per associare la variabile a una colonna datetime di SQL Server, le funzioni di copia bulk converteno la clausola di escape timestamp nella variabile di caratteri nel formato datetime appropriato.

Nella tabella seguente sono elencati i tipi di dati consigliati da usare nel mapping da un tipo di dati SQL ODBC a un tipo di dati DI SQL Server.

Tipo di dati SQL ODBC Tipo di dati C ODBC bcp_bind parametro di tipo Tipo di dati di 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 Testo
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

binario variabile
SQL_LONGVARBINARY SQL_C_BINARY SQLBINARY Immagine
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 di tipi di dati tinyint, unsigned smallint o unsigned int . Per evitare la perdita di valori di dati durante la migrazione di questi tipi di dati, creare la tabella di SQL Server con il tipo di dati integer più grande successivo. Per impedire agli utenti di aggiungere successivamente valori esterni all'intervallo consentito dal tipo di dati originale, applicare una regola alla colonna di SQL Server per limitare i valori consentiti all'intervallo supportato dal tipo di dati nell'origine 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 interval. Un'applicazione può, tuttavia, archiviare sequenze di escape intervallo come stringhe di caratteri in una colonna di caratteri di SQL Server. L'applicazione può leggerle per usarle in un secondo momento, ma non possono essere usate nelle istruzioni Transact-SQL.

Le funzioni di copia bulk possono essere usate per caricare rapidamente i dati in SQL Server letti da un'origine dati ODBC. Usare SQLBindCol per associare le colonne di un set di risultati alle variabili di programma, quindi usare bcp_bind per associare le stesse variabili di programma a un'operazione di copia bulk. La chiamata a SQLFetchScroll o SQLFetch recupera quindi una riga di dati dall'origine dati ODBC nelle variabili di programma e chiama bcp_sendrow copia in blocco i dati dalle variabili di programma a SQL Server.

Un'applicazione può usare la funzione bcp_colptr ogni volta che deve modificare l'indirizzo della variabile di dati specificata originariamente nel parametro bcp_bind pData. Un'applicazione può usare la funzione bcp_collen ogni volta che deve modificare la lunghezza dei dati specificata originariamente nel parametro cbData bcp_bind.

Non è possibile leggere i dati da SQL Server in variabili di programma usando la copia bulk; non c'è niente di simile a una funzione "bcp_readrow". È possibile solo inviare i dati dall'applicazione al server.

Vedi anche

Esecuzione di operazioni di copia bulk (ODBC)