Esecuzione di operazioni di copia bulk

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

Download del driver OLE DB

La funzionalità di copia bulk di SQL Server supporta il trasferimento di grandi quantità di dati in o da una tabella o una vista di SQL Server. Il trasferimento dei dati può essere eseguito anche specificando un'istruzione SELECT. È possibile spostare i dati tra SQL Server e un file di dati del sistema operativo, ad esempio un file ASCII. Il file di dati può avere formati diversi. Per eseguire una copia bulk in un file di formato, è necessario definire il formato. I dati possono essere caricati in variabili di programma e trasferiti a SQL Server mediante metodi e funzioni di copia bulk.

Per un'applicazione di esempio che illustra questa funzionalità, vedere Eseguire una copia bulk dei dati usando IRowsetFastLoad (OLE DB).

In un'applicazione la copia bulk viene generalmente utilizzata in una delle modalità seguenti:

  • Copia bulk da una tabella, da una vista o dal set di risultati di un'istruzione Transact-SQL in un file di dati in cui i dati vengono archiviati nello stesso formato della tabella o della vista.

    Tale file viene definito file di dati in modalità nativa.

  • Copia bulk da una tabella, da una vista o dal set di risultati di un'istruzione Transact-SQL in un file di dati in cui i dati vengono archiviati in un formato diverso da quello della tabella o della vista.

    In questo caso viene creato un file di formato separato che definisce le caratteristiche (tipo di dati, posizione, lunghezza, carattere di terminazione e così via) di ogni colonna che viene archiviata nel file di dati. Se tutte le colonne vengono convertite in formato carattere, il file risultante viene definito file di dati in modalità carattere.

  • Copia bulk da un file di dati in una tabella o una vista.

    Se necessario, viene utilizzato un file di formato per determinare il layout del file di dati.

  • Caricare i dati in variabili di programma, quindi importarli in una tabella o in una vista utilizzando le funzioni di copia bulk per eseguire una copia bulk in una riga per volta.

Non è necessario che i file di dati utilizzati dalle funzioni di copia bulk vengano creati da un altro programma per la copia bulk. È possibile generare un file di dati e il file di formato in base alle definizioni della copia bulk in qualsiasi altro modo. Tali file possono essere quindi utilizzati con un programma per la copia bulk di SQL Server per importare i dati in SQL Server. È ad esempio possibile esportare dati da un foglio di calcolo in un file delimitato da tabulazione, compilare un file di formato che descrive il file delimitato da tabulazione, quindi utilizzare un programma per la copia bulk per importare rapidamente i dati in SQL Server. I file di dati generati dalla copia bulk possono essere importati anche in altre applicazioni. È ad esempio possibile utilizzare le funzioni di copia bulk per esportare i dati da una tabella o da una vista in un file con valori delimitati da tabulazioni, che è quindi possibile caricare in un foglio di calcolo.

I programmatori che eseguono la codifica di applicazioni per l'utilizzo delle funzioni di copia bulk devono seguire le regole generali per garantire un buon livello di prestazioni per la copia bulk. Per altre informazioni sul supporto delle operazioni di copia bulk in SQL Server, vedere Importazione ed esportazione bulk di dati (SQL Server).

Limitazioni e restrizioni

Un tipo CLR definito dall'utente deve essere associato come dati binari. Anche se un file di formato specifica SQLCHAR come tipo di dati per una colonna con tipo definito dall'utente (UDT) di destinazione, l'utilità BCP tratterà i dati come binari.

Non utilizzare SET FMTONLY OFF con le operazioni di copia bulk. SET FMTONLY OFF può compromettere la riuscita dell'operazione di copia bulk o determinare risultati imprevisti.

Driver OLE DB per SQL Server

In OLE DB Driver per SQL Server è prevista l'implementazione di due metodi per eseguire le operazioni di copia bulk con un database di SQL Server. Il primo metodo prevede l'uso dell'interfaccia IRowsetFastLoad per le operazioni di copia bulk basate sulla memoria, mentre il secondo prevede l'uso dell'interfaccia IBCPSession per le operazioni di copia bulk basate su file.

Utilizzo di operazioni di copia bulk basate sulla memoria

Il driver OLE DB per SQL Server implementa l'interfaccia IRowsetFastLoad per esporre il supporto per le operazioni di copia bulk basate sulla memoria di SQL Server. L'interfaccia IRowsetFastLoad implementa i metodi IRowsetFastLoad::Commit e IRowsetFastLoad::InsertRow.

Abilitazione di una sessione per IRowsetFastLoad

Il consumer notifica a OLE DB Driver per SQL Server la necessità di eseguire una copia bulk impostando su VARIANT_TRUE la proprietà SSPROP_ENABLEFASTLOAD dell'origine dati specifica di OLE DB Driver per SQL Server. Con la proprietà impostata sull'origine dati, il consumer crea una sessione di OLE DB Driver per SQL Server. La nuova sessione consente al consumer di accedere all'interfaccia IRowsetFastLoad.

Nota

Se l'interfaccia IDataInitialize viene usata per l'inizializzazione dell'origine dati, è necessario impostare la proprietà SSPROP_IRowsetFastLoad nel parametro rgPropertySets del metodo IOpenRowset::OpenRowset. In caso contrario, la chiamata al metodo OpenRowset restituirà E_NOINTERFACE.

L'abilitazione di una sessione per la copia bulk vincola il supporto di OLE DB Driver per SQL Server per le interfacce nella sessione. Una sessione abilitata per la copia bulk espone solo le interfacce seguenti:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Per disabilitare la creazione di set di righe abilitati per la copia bulk e fare in modo che la sessione del driver OLE DB per SQL Server ripristini l'elaborazione standard, reimpostare SSPROP_ENABLEFASTLOAD su VARIANT_FALSE.

Set di righe IRowsetFastLoad

I set di righe della copia bulk del driver OLE DB per SQL Server sono di sola scrittura, ma espongono interfacce che consentono al consumer di determinare la struttura di una tabella di SQL Server. Le interfacce seguenti sono esposte su un set di righe di OLE DB Driver per SQL Server abilitato per la copia bulk:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Le proprietà SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS e SSPROP_FASTLOADKEEPIDENTITY specifiche del provider controllano i comportamenti di un set di righe della copia bulk del driver OLE DB per SQL Server. Le proprietà vengono specificate nel membro rgProperties di un membro del parametro rgPropertySetsIOpenRowset.

ID proprietà Descrizione
SSPROP_FASTLOADKEEPIDENTITY Colonna: nessuna

L/S: Lettura/Scrittura

Tipo: VT_BOOL

Impostazione predefinita: VARIANT_FALSE

Descrizione: gestisce i valori Identity forniti dal consumer.

VARIANT_FALSE: i valori per una colonna Identity nella tabella di SQL Server vengono generati da SQL Server. Qualsiasi valore associato alla colonna viene ignorato da OLE DB Driver per SQL Server.

VARIANT_TRUE: il consumer associa una funzione di accesso che fornisce un valore per una colonna Identity di SQL Server. La proprietà Identity non è disponibile in colonne che supportano valori NULL, pertanto il consumer specifica un valore univoco per ogni chiamata a IRowsetFastLoad::Insert.
SSPROP_FASTLOADKEEPNULLS Colonna: nessuna

L/S: Lettura/Scrittura

Tipo: VT_BOOL

Impostazione predefinita: VARIANT_FALSE

Descrizione: gestisce valori NULL per le colonne con un vincolo DEFAULT. Ha effetto solo su colonne SQL Server che supportano valori NULL e alle quali è applicato un vincolo DEFAULT.

VARIANT_FALSE: SQL Server inserisce il valore predefinito per la colonna quando il consumer del driver OLE DB per SQL Server inserisce una riga che contiene NULL per la colonna.

VARIANT_TRUE: SQL Server inserisce NULL per il valore della colonna quando il consumer del driver OLE DB per SQL Server inserisce una riga che contiene NULL per la colonna.
SSPROP_FASTLOADOPTIONS Colonna: nessuna

L/S: Lettura/Scrittura

Tipo: VT_BSTR

Impostazione predefinita: nessuna

Descrizione: questa proprietà corrisponde all'opzione -h "hint[,...n]" dell'utilità bcp. Di seguito sono indicate le stringhe che è possibile utilizzare come opzioni per l'esecuzione della copia bulk di dati in una tabella.

ORDER(column[ASC | DESC][,...n]): ordinamento di dati nel file di dati. Le prestazioni della copia bulk vengono migliorate se il file di dati da caricare viene ordinato in base all'indice cluster della tabella.

ROWS_PER_BATCH = bb: numero di righe di dati per batch (come bb). Il server ottimizza il caricamento bulk in base al valore bb. Per impostazione predefinita, il valore ROWS_PER_BATCH è sconosciuto.

KILOBYTES_PER_BATCH = cc: numero di kilobyte (KB) di dati per batch (come cc). Per impostazione predefinita, il valore KILOBYTES_PER_BATCH è sconosciuto.

TABLOCK: un blocco a livello di tabella viene acquisito per la durata dell'operazione di copia bulk. Questa opzione migliora in modo significativo le prestazioni, in quanto mantenere attivo un blocco solo per la durata dell'operazione di copia bulk riduce la contesa dei blocchi per la tabella. Una tabella può essere caricata contemporaneamente da più client se non include indici e si specifica TABLOCK. Per impostazione predefinita, il comportamento del blocco è determinato dall'opzione di tabella table lock on bulk load.

CHECK_CONSTRAINTS: eventuali vincoli per table_name vengono controllati durante l'operazione di copia bulk. Per impostazione predefinita, i vincoli vengono ignorati.

FIRE_TRIGGER: SQL Server usa il controllo delle versioni delle righe per i trigger e memorizza le versioni delle righe nell'archivio delle versioni in tempdb. Le ottimizzazioni della registrazione bulk sono, pertanto, disponibili anche quando i trigger sono abilitati. Prima di eseguire l'importazione bulk di un batch con un numero elevato di righe con i trigger abilitati, può essere necessario aumentare le dimensioni di tempdb.

Utilizzo di operazioni di copia bulk basate su file

Il driver OLE DB per SQL Server implementa l'interfaccia IBCPSession per esporre il supporto per le operazioni di copia bulk basate su file di SQL Server. L'interfaccia IBCPSession implementa i metodi IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt e IBCPSession::BCPWriteFmt .

Vedi anche

Driver OLE DB per funzionalità di SQL Server
Proprietà delle origini dati (OLE DB)
Informazioni sull'importazione e l'esportazione in blocco di dati (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)