Copia bulk da variabili di programma
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
È 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_collen per 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.