Condividi tramite


Esecuzione di operazioni di copia bulk in SQL Server Native Client

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)

Importante

SQL Server Native Client (SNAC) non viene fornito con:

  • SQL Server 2022 (16.x) e versioni successive
  • SQL Server Management Studio 19 e versioni successive

SQL Server Native Client (SQLNCLI o SQLNCLI11) e il provider OLE DB Microsoft legacy per SQL Server (SQLOLEDB) non sono consigliati per lo sviluppo di nuove applicazioni.

Per i nuovi progetti, usare uno dei driver seguenti:

Per SQLNCLI fornito come componente del motore di database di SQL Server (versioni dal 2012 al 2019), vedere questa Eccezione relativa al ciclo di vita del supporto.

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.

Provider OLE DB di SQL Server Native Client

Il provider OLE DB di SQL Server Native Client implementa due metodi per eseguire 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 provider OLE DB di SQL Server Native Client 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 al provider OLE DB di SQL Server Native Client la necessità di eseguire la copia bulk impostando la proprietà dell'origine dati specifica del provider OLE DB di SQL Server Native Client SSPROP_ENABLEFASTLOAD su VARIANT_TRUE. Con la proprietà impostata nell'origine dati, il consumer crea una sessione del provider OLE DB di SQL Server Native Client. 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 del provider OLE DB di SQL Server Native Client 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 provider OLE DB di SQL Server Native Client ripristini l'elaborazione standard, reimpostare SSPROP_ENABLEFASTLOAD su VARIANT_FALSE.

Set di righe IRowsetFastLoad

I set di righe di copia bulk del provider OLE DB di SQL Server Native Client sono di sola scrittura, ma espongono interfacce che consentono al consumer di determinare la struttura di una tabella di SQL Server. Le interfacce seguenti vengono esposte in un set di righe del provider OLE DB di SQL Server Native Client abilitato per la copia bulk:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Le proprietà specifiche del provider SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS e i comportamenti di controllo SSPROP_FASTLOADKEEPIDENTITY di un set di righe di copia bulk del provider SQL Server Native Client. Le proprietà vengono specificate nel membro rgProperties di un membro del parametro IOpenRowsetdi rgPropertySets.

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 per la colonna viene ignorato dal provider OLE DB di SQL Server Native Client.

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 provider OLE DB di SQL Server Native Client inserisce una riga contenente NULL per la colonna.

VARIANT_TRUE: SQL Server inserisce NULL per il valore della colonna quando il consumer del provider OLE DB di SQL Server Native Client inserisce una riga contenente 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 provider OLE DB di SQL Server Native Client 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 .

Driver ODBC di SQL Server Native Client

Il driver ODBC di SQL Server Native Client mantiene lo stesso supporto per le operazioni di copia bulk che fanno parte delle versioni precedenti del driver ODBC di SQL Server. Per informazioni sulle operazioni di copia bulk tramite il driver ODBC di SQL Server Native Client, vedere Esecuzione di operazioni di copia bulk (ODBC).

Vedi anche

Funzionalità di SQL Server Native Client
Proprietà delle origini dati (OLE DB)
Informazioni sull'importazione e l'esportazione in blocco di dati (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
Ottimizzazione delle prestazioni dell'importazione bulk