Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di
AzureIstanza gestita di SQL di
AzureWarehouse in Microsoft Fabric
Importa un file di dati in una tabella o vista di database in un formato specificato dall'utente in SQL Server.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' | 'native' | 'widenative' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = 'CSV' ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
-- database options
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] TABLOCK ]
-- source options
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] BATCHSIZE = batch_size ]
) ]
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'code_page' | 'ACP' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = { 'CSV' | 'PARQUET' } ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
) ]
Argomenti
L'istruzione BULK INSERT include argomenti e opzioni diversi in piattaforme diverse. Le differenze sono riepilogate nella tabella seguente:
| Caratteristica | SQL Server | Database SQL di Azure e Istanza gestita di SQL di Azure | Data warehouse dell'infrastruttura |
|---|---|---|---|
| Origine dati | Percorso locale, percorso di rete (UNC) o Archiviazione di Azure | Archiviazione di Azure | Azure Storage, One Lake |
| Autenticazione di origine | Autenticazione di Windows, firma di accesso condiviso | Microsoft Entra ID, token di firma di accesso condiviso, identità gestita | Microsoft Entra ID |
| Opzioni non supportate |
* Imprese nel percorso, FORMAT = 'PARQUET' |
* Imprese nel percorso, FORMAT = 'PARQUET' |
DATAFILETYPE = {'native' | 'widenative'} |
| Opzioni abilitate ma senza effetto |
KEEPIDENTITY
FIRE_TRIGGERS, CHECK_CONSTRAINTS, TABLOCK, ORDER, ROWS_PER_BATCH, , KILOBYTES_PER_BATCHe BATCHSIZE non sono applicabili. Non generano un errore di sintassi, ma non hanno alcun effetto |
database_name
Nome del database contenente la tabella o la vista specificata. Se l'argomento database_name non è specificato, verrà usato il nome del database corrente.
schema_name
Consente di specificare il nome dello schema della tabella o della vista. schema_name è facoltativo se lo schema predefinito per l'utente che esegue l'operazione di importazione bulk corrisponde allo schema della tabella o della vista specificata. Se lo schema non è specificato e lo schema predefinito dell'utente che esegue l'operazione di importazione bulk è diverso dalla tabella o dalla vista specificata, SQL Server restituirà un messaggio di errore e l'operazione di importazione bulk verrà annullata.
table_name
Nome della tabella o della vista in cui eseguire l'importazione bulk dei dati. È possibile utilizzare solo le viste in cui tutte le colonne fanno riferimento alla stessa tabella di base. Per altre informazioni sulle restrizioni per il caricamento dei dati nelle visualizzazioni, vedere INSERT.
DA 'data_file'
Specifica il percorso completo del file contenente i dati da importare nella tabella o nella vista specificata.
BULK INSERT può importare dati da un disco o da Azure Storage (inclusi rete, floppy disk, hard disk e così via).
BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
In data_file deve essere specificato un percorso valido dal server in cui è in esecuzione SQL Server. Se data_file corrisponde a un file remoto, è necessario specificare il nome UNC (Universal Naming Convention). Il formato di un nome UNC è \\SystemName\ShareName\Path\FileName. Ad esempio:
BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
Azure SQL Database e Fabric Data Warehouse supportano la lettura dei dati da URI, ma non supportano percorsi di file on-premises.
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv';
A partire da SQL Server 2017 (14.x), il data_file può essere in Azure Storage. In tal caso, è necessario specificare anche data_source_name opzione. Per un esempio, vedi Importa dati da un file in Azure Storage.
Fabric Data Warehouse supporta due diversi stili di percorso per specificare il percorso sorgente:
https://<storage account>.blob.core.windows.net/<container name>/<path to file>abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>
Fabric Data Warehouse supporta * le carte jolly che possono corrispondere a qualsiasi carattere nell'URI e ti permettono di definire un pattern URI per i file da importare. Ad esempio:
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';
Nota
Sostituire <data-lake>.blob.core.windows.net con un URL appropriato.
FONTE_DATI
Si applica a: SQL Server 2017 (14.x) e versioni successive, Azure SQL Database e Warehouse in Microsoft Fabric.
Specifica una fonte di dati esterna nominata che punta a una posizione radice di Azure Storage per l'importazione del file.
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION = 'https://<data-lake>.blob.core.windows.net/public/');
Nota
Sostituire <data-lake>.blob.core.windows.net con un URL appropriato.
Per altre informazioni, vedere CREATE EXTERNAL DATA SOURCE.
Il percorso del file nella FROM clausola deve essere un percorso relativo, che verrà aggiunto alla posizione radice definita nella sorgente dati esterna.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');
Nota
Per semplicità, i seguenti esempi utilizzano percorsi relativi e fonti di dati esterne predefinite.
CODEPAGE
Specifica la tabella codici dei dati contenuti nel file di dati.
CODEPAGE è rilevante solo se i dati contengono colonne char, varchar o text con valori di carattere maggiori 127 o minori di 32. Per un esempio, vedere Definire una tabella codici.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, CODEPAGE = '65001');
CODEPAGE non è un'opzione supportata in Linux per SQL Server 2017 (14.x). Per SQL Server 2019 (15.x), è consentita solo l'opzione 'RAW' per CODEPAGE.
Si consiglia di specificare un nome di regole di confronto per ogni colonna in un file di formato.
Valore della proprietà CODEPAGE |
Descrizione |
|---|---|
ACP |
Le colonne con tipo di dati char, varchar o text vengono convertite dalla tabella codici ANSI/Microsoft Windows (ISO 1252) nella tabella codici di SQL Server. |
OEM (impostazione predefinita) |
Le colonne di tipo char, varchar o text vengono convertite dalla tabella codici di sistema OEM alla tabella codici di SQL Server. |
RAW |
Non vengono eseguite conversioni tra tabelle codici.
RAW è l'opzione più veloce. |
| code_page | Numero specifico della tabella codici, ad esempio 850. Le versioni precedenti a SQL Server 2016 (13.x) non supportano la tabella codici 65001 (codifica UTF-8). |
Valore della proprietà CODEPAGE |
Descrizione |
|---|---|
ACP |
Le colonne con tipo di dati char, varchar o text vengono convertite dalla tabella codici ANSI/Microsoft Windows (ISO 1252) nella tabella codici di SQL Server. |
| code_page | Numero specifico della tabella codici, ad esempio 850. Le versioni precedenti a SQL Server 2016 (13.x) non supportano la tabella codici 65001 (codifica UTF-8). |
DATAFILETYPE
Specifica che BULK INSERT esegue l'operazione di importazione utilizzando il valore del tipo di file di dati specificato.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, DATAFILETYPE = 'char');
Nota
Sostituire <data-lake>.blob.core.windows.net con un URL appropriato.
Valore della proprietà DATAFILETYPE |
Tutti i dati rappresentati in |
|---|---|
char (impostazione predefinita) |
Formato carattere. Per ulteriori informazioni, vedi Usa il formato del carattere per importare o esportare dati. |
widechar |
Caratteri Unicode. Per ulteriori informazioni, vedi Usa il formato di carattere Unicode per importare o esportare dati. |
native |
Tipi di dati nativi (database). Creare il file di dati nativo eseguendo l'importazione bulk dei dati da SQL Server tramite l'utilità bcp. Il valore native rappresenta un'alternativa con prestazioni superiori rispetto al valore char. L'uso del formato nativo è consigliabile in caso di trasferimento bulk dei dati tra più istanze di SQL Server tramite un file di dati che non contiene caratteri estesi o DBCS (Double Byte Character Set). Per ulteriori informazioni, vedi Usa il formato nativo per importare o esportare dati. |
widenative |
Tipi di dati nativi (database), ad eccezione delle colonne di tipo char, varchar e text, in cui i dati vengono archiviati in formato Unicode. Creare il widenative file di dati importando in blocco dati da SQL Server usando l'utilità bcp .Il widenative valore offre un'alternativa a prestazioni più elevate a widechar. Se il file di dati contiene caratteri estesi ANSI, specificare widenative.Per maggiori informazioni, vedi Usa il formato nativo Unicode per importare o esportare dati. |
Valore della proprietà DATAFILETYPE |
Tutti i dati rappresentati in |
|---|---|
char (impostazione predefinita) |
Formato carattere. Per ulteriori informazioni, vedi Usa il formato del carattere per importare o esportare dati. |
widechar |
Caratteri Unicode. Per ulteriori informazioni, vedi Usa il formato di carattere Unicode per importare o esportare dati. |
MAXERRORS
Specifica il numero massimo di errori di sintassi consentiti nei dati prima dell'annullamento dell'operazione di importazione bulk. Qualsiasi riga che non sia possibile importare tramite l'operazione di importazione bulk viene ignorata e considerata come errore. Se il valore max_errors non è specificato, viene usato il valore predefinito, ovvero 10.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', MAXERRORS = 0);
L'opzione MAX_ERRORS non si applica ai controlli di vincoli o alla conversione di tipi di dati di denaro e bigint .
ERRORFILE
Specifica il file usato per raccogliere le righe che contengono errori di formattazione e non possono essere convertite in un set di righe OLE DB. Tali righe vengono copiate nel file degli errori dal file di dati così come sono.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/errors');
Nota
Sostituire <data-lake>.blob.core.windows.net con un URL appropriato.
Il file degli errori viene creato durante l'esecuzione del comando. Se il file esiste già, viene generato un errore. Viene inoltre creato un file di controllo con l'estensione .ERROR.txt , che fa riferimento a ogni riga nel file di errore e fornisce la diagnostica degli errori. Una volta corretti gli errori, è possibile caricare i dati.
A partire da SQL Server 2017 (14.x), il error_file_path può essere in Azure Storage.
ERRORFILE_DATA_SOURCE
Si applica a: SQL Server 2017 (14.x) e versioni successive.
Specifica una sorgente dati esterna nominata che punta alla posizione Azure Storage del file di errore per tenere traccia degli errori riscontrati durante l'importazione.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'curated/covid-19/bing_covid-19_data/latest/errors',
ERRORFILE_DATA_SOURCE = 'pandemicdatalake'
);
Per maggiori dettagli sulla creazione di fonti di dati esterne, vedi CREA SORGENTE DI DATI ESTERNA.
PRIMA FILA
Specifica il numero della prima riga da caricare. Il valore predefinito è la prima riga nel file di dati specificato.
FIRSTROW è basato su 1.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2);
L'attributo FIRSTROW non è progettato per ignorare le intestazioni di colonna. L'istruzione BULK INSERT non supporta l'omissione delle intestazioni. Se si sceglie di ignorare le righe, il motore di database SQL Server esaminerà solo i terminatori dei campi e non convaliderà i dati presenti nei campi delle righe ignorate.
ULTIMA FILA
Specifica il numero dell'ultima riga da caricare. Il valore predefinito è 0, che indica l'ultima riga nel file di dati specificato.
DIMENSIONE DEL LOTTO
Specifica il numero di righe in un batch. Ogni batch viene copiato nel server come singola transazione. In caso di errori, SQL Server eseguirà il commit o il rollback della transazione per ogni batch. Per impostazione predefinita, tutti i dati inclusi nel file di dati specificato costituiscono un batch. Per alcune considerazioni relative alle prestazioni, vedere la sezione Considerazioni sulle prestazioni disponibile più avanti in questo articolo.
VINCOLI_DI_CONTROLLO
Specifica che tutti i vincoli sulla tabella o sulla vista di destinazione devono essere controllati durante l'operazione di importazione bulk. Senza l'opzione CHECK_CONSTRAINTS , gli eventuali CHECK vincoli e FOREIGN KEY vengono ignorati e, dopo l'operazione, il vincolo nella tabella viene contrassegnato come non attendibile.
UNIQUE i vincoli e PRIMARY KEY vengono sempre applicati. Quando si importa in una colonna di caratteri definita con un NOT NULL vincolo, BULK INSERT inserisce una stringa vuota quando non è presente alcun valore nel file di testo.
A un certo punto, sarà necessario esaminare i vincoli nell'intera tabella. Se la tabella non era vuota prima dell'operazione di importazione bulk, il costo della riconvalida del vincolo potrebbe superare il costo di applicazione CHECK dei vincoli ai dati incrementali.
Una situazione in cui può essere necessario disabilitare i vincoli (comportamento predefinito) è rappresentata dal caso in cui i dati di input contengono righe che violano i vincoli. Con CHECK i vincoli disabilitati, è possibile importare i dati e quindi usare istruzioni Transact-SQL per rimuovere i dati non validi.
Nota
L'opzione MAXERRORS non si applica al controllo dei vincoli.
FIRE_TRIGGERS
Specifica che gli eventuali trigger di inserimento definiti nella tabella di destinazione vengono eseguiti durante l'operazione di importazione bulk. Se i trigger vengono definiti per INSERT le operazioni nella tabella di destinazione, vengono attivati per ogni batch completato.
Se FIRE_TRIGGERS non viene specificato, non vengono eseguiti trigger di inserimento.
KEEPIDENTITY
Specifica che il valore o i valori Identity presenti nel file di dati importato devono essere usati per la colonna Identity. Se KEEPIDENTITY non viene specificato, i valori Identity per questa colonna vengono verificati ma non importati e SQL Server assegna automaticamente valori univoci in base ai valori di inizializzazione e incremento specificati durante la creazione della tabella. Se il file di dati non contiene valori per la colonna Identity nella tabella o nella vista, usare un file di formato per specificare che durante l'importazione dei dati la colonna Identity nella tabella o nella vista deve essere ignorata. SQL Server assegnerà automaticamente valori univoci alla colonna. Per altre informazioni, vedere DBCC CHECKIDENT.
Per ulteriori informazioni, vedi come mantenere i valori identificativi, vedi Conserva valori identità quando importi dati in massa.
KEEPNULLS
Specifica che durante l'operazione di importazione bulk le colonne vuote devono mantenere un valore Null. Ciò significa che durante l'operazione non verranno inseriti eventuali valori predefiniti per le colonne vuote. Per maggiori informazioni, vedi Conserva i valori nulli o predefiniti durante l'importazione in massa.
KILOBYTES_PER_BATCH
Specifica il numero approssimativo di kilobyte (KB) di dati per ogni batch come kilobytes_per_batch. Per impostazione predefinita, KILOBYTES_PER_BATCH è sconosciuto. Per alcune considerazioni relative alle prestazioni, vedere la sezione Considerazioni sulle prestazioni disponibile più avanti in questo articolo.
ORDINE
Specifica il tipo di ordinamento dei dati nel file. Le prestazioni dell'importazione bulk sono migliori se i dati da importare vengono ordinati in base all'indice cluster della tabella, se disponibile. Se il file di dati viene ordinato in un ordine diverso dall'ordine di una chiave di indice cluster o se nella tabella non è presente alcun indice cluster, la clausola ORDER viene ignorata. I nomi di colonna specificati devono corrispondere a nomi di colonna validi nella tabella di destinazione. Per impostazione predefinita, per l'operazione di inserimento bulk si presume che il file di dati non sia ordinato. Per garantire l'ottimizzazione dell'importazione bulk, SQL Server verifica inoltre che i dati importati siano ordinati.
n è un segnaposto che indica la possibilità di specificare più colonne.
ROWS_PER_BATCH
Indica il numero approssimativo di righe di dati nel file di dati.
Per impostazione predefinita, tutti i dati nel file di dati vengono inviati al server come singola transazione e il numero di righe nel batch non è noto per Query Optimizer. Se si specifica ROWS_PER_BATCH (con un valore > 0), il server usa questo valore per ottimizzare l'operazione di importazione bulk. Il valore specificato per ROWS_PER_BATCH deve essere approssimativamente uguale al numero effettivo di righe. Per alcune considerazioni relative alle prestazioni, vedere la sezione Considerazioni sulle prestazioni disponibile più avanti in questo articolo.
TABLOCK
Imposta l'acquisizione di un blocco a livello di tabella per l'intera durata dell'operazione di importazione bulk. Una tabella può essere caricata simultaneamente da più client se la tabella non contiene indici e TABLOCK viene specificata. Per impostazione predefinita, la modalità di blocco è determinata dall'opzione table lock on bulk loaddella tabella. Quando un blocco viene mantenuto attivo solo per la durata dell'operazione di importazione bulk, la contesa tra blocchi nella tabella viene ridotta, producendo in alcuni casi un miglioramento significativo delle prestazioni. Per alcune considerazioni relative alle prestazioni, vedere la sezione Considerazioni sulle prestazioni disponibile più avanti in questo articolo.
Il comportamento di blocco per un indice columnstore è diverso, perché tale indice è suddiviso internamente in più set di righe. Ogni thread carica i dati esclusivamente in ogni set di righe accettando un blocco esclusivo (X) sul set di righe che consente il caricamento dei dati paralleli con sessioni di caricamento dati simultanee. L'uso dell'opzione TABLOCK consente al thread di accettare un blocco esclusivo sulla tabella (a differenza del blocco di aggiornamento bulk per i set di righe tradizionali) che impedisce ad altri thread simultanei di caricare i dati contemporaneamente.
Opzioni di formato del file di input
FORMATO
Si applica a: SQL Server 2017 (14.x) e versioni successive.
specifica un file di valori delimitati da virgole conforme allo standard RFC 4180.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FORMAT = 'CSV');
In Fabric Data Warehouse, l'istruzione BULK INSERT supporta gli stessi formati dell'istruzione COPY INTO , quindi FORMAT = 'PARQUET' è supportata anch'essa.
CITAZIONE SUL CAMPO
Si applica a: SQL Server 2017 (14.x) e versioni successive.
Specifica un carattere da usare come carattere di virgoletta nel file CSV. Se non specificato, il carattere virgolette (") viene usato come carattere virgolette, come definito nello standard RFC 4180 .
FORMATFILE
Specifica il percorso completo di un file di formato. Un file di formato descrive il file di dati contenente le risposte archiviate create tramite l'utilità bcp nella stessa tabella o vista.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt');
Nota
Sostituire <data-lake>.blob.core.windows.net con un URL appropriato.
È consigliabile utilizzare il file di formato nei casi seguenti:
- Il file di dati contiene un numero di colonne maggiore o minore rispetto alla tabella o alla vista.
- Le colonne sono in un ordine diverso.
- I delimitatori di colonna variano.
- Sono presenti altre modifiche di formato dei dati. I file di formato vengono in genere creati tramite l'utilità bcp e modificati in un editor di testo in base alle esigenze. Per maggiori informazioni, vedi bcp Utility e Crea un file di formato con bcp.
A partire da SQL Server 2017 (14.x), e in Azure SQL Database, format_file_path può essere in Azure Storage.
FORMATFILE_DATA_SOURCE
Si applica a: SQL Server 2017 (14.x) e versioni successive.
Specifica una sorgente dati esterna nominata che punta alla posizione Azure Storage del file di formato per definire lo schema dei dati importati.
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
FORMATFILE_DATA_SOURCE = 'pandemicdatalake'
);
FIELDTERMINATOR
Specifica il terminatore di campo da utilizzare e charwidechar i file dati. Il carattere di terminazione del campo predefinito è \t (carattere di tabulazione). Per altre informazioni, vedere Specificare caratteri di terminazione dei campi e delle righe.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIELDTERMINATOR = ',', FIRSTROW = 2);
ROWTERMINATOR
Specifica il terminatore di riga da utilizzare e charwidechar i file dati.
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', ROWTERMINATOR = '\r\n', FIRSTROW = 2);
Il terminator di riga predefinito è \r\n (carattere di ritorno a carrello e nuova linea). Per altre informazioni, vedere Specificare caratteri di terminazione dei campi e delle righe.
Compatibilità
BULK INSERT applica una rigorosa convalida dei dati e i controlli dei dati letti da un file che potrebbero causare l'esito negativo degli script esistenti quando vengono eseguiti su dati non validi. Ad esempio, BULK INSERT verifica che:
- Validità delle rappresentazioni native dei tipi di dati float o real.
- Lunghezza in byte pari dei dati Unicode.
Tipo di dati
Conversioni del tipo di dati da string a decimal
Le conversioni dei tipi di dati da stringa a decimale utilizzate in BULK INSERT seguono le stesse regole della funzione CONVERT Transact-SQL, che rifiuta stringhe che rappresentano valori numerici che utilizzano la notazione scientifica. Pertanto, BULK INSERT considera tali stringhe come valori non validi e segnala errori di conversione.
Per risolvere il problema, usare un file di formato per eseguire l'importazione bulk dei dati float in notazione scientifica in una colonna decimale. Nel file di formato, descrivere in modo esplicito la colonna come dati real o float. Per altre informazioni su questi tipi di dati, vedere float e real.
I file di formato rappresentano i dati real con il tipo di dati SQLFLT4 e i dati float con il tipo di dati SQLFLT8. Per informazioni sui file non in formato XML, vedi Specifica il tipo di archiviazione del file usando bcp.
Esempio di importazione di un valore numerico con notazione scientifica
In questo esempio viene utilizzata la seguente tabella del database bulktest:
CREATE TABLE dbo.t_float
(
c1 FLOAT,
c2 DECIMAL (5, 4)
);
Si desidera eseguire l'importazione bulk di dati nella tabella t_float. Il file di dati, C:\t_float-c.dat, contiene dati float di notazione scientifica, ad esempio:
8.0000000000000002E-2 8.0000000000000002E-2
Quando si copia questo esempio, tenere presente che diversi editor di testo e codifiche salvano i caratteri di tabulazione (\t) come spazi. Un carattere di tabulazione viene presentato più avanti in questo esempio.
Non è tuttavia BULK INSERT possibile importare questi dati direttamente in t_floatperché la seconda colonna, c2, usa il tipo di dati decimale . È pertanto necessario un file di formato. Il file di formato deve eseguire il mapping dei dati float in notazione scientifica al formato decimale della colonna c2.
Il file di formato seguente usa il tipo di dati SQLFLT8 per eseguire il mapping del secondo campo dati alla seconda colonna:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30" />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8" />
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8" />
</ROW>
</BCPFORMAT>
Per importare i dati di test nella tabella di test tramite questo file di formato (usando il nome di file C:\t_floatformat-c-xml.xml), eseguire la seguente istruzione Transact-SQL:
BULK INSERT bulktest.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');
Importante
Azure SQL Database e Fabric Data Warehouse supportano solo la lettura da URI (ad esempio, Azure Storage).
Tipi di dati per l'esportazione o l'importazione bulk di documenti SQLXML
Per eseguire l'esportazione o l'importazione bulk di dati SQLXML, utilizzare uno dei tipi di dati seguenti nel file di formato:
| Tipo di dati | Effetto |
|---|---|
| sqlchar o SQLVARCHAR | I dati vengono inviati nella tabella codici del client o nella tabella codici implicita delle regole di confronto. L'effetto equivale a specificare il DATAFILETYPE = 'char' senza specificare un file di formato. |
| SQLNCHAR o SQLNVARCHAR | I dati vengono inviati in formato Unicode. L'effetto equivale a specificare il DATAFILETYPE = 'widechar' senza specificare un file di formato. |
| SQLBINARY o SQLVARBIN | I dati vengono inviati senza conversione. |
Osservazioni:
Per un confronto tra l'istruzione BULK INSERT , l'istruzione INSERT ... SELECT * FROM OPENROWSET(BULK...) e il bcp comando, vedi Importazione e Esportazione in massa dei dati.
Per informazioni sulla preparazione dei dati per l'importazione bulk, vedere Preparare i dati per l'esportazione o l'importazione bulk.
L'istruzione BULK INSERT può essere eseguita all'interno di una transazione definita dall'utente per importare dati in una tabella o in una vista. Facoltativamente, per usare più corrispondenze per l'importazione bulk dei dati, una transazione può specificare la BATCHSIZE clausola nell'istruzione BULK INSERT . Se viene eseguito il rollback di una transazione a più batch, viene eseguito il rollback di ogni batch inviato alla transazione a SQL Server.
Interoperabilità
Importare dati da un file CSV
A partire da SQL Server 2017 (14.x), BULK INSERT supporta il formato CSV, così come il database SQL di Azure.
Nelle versione precedenti al rilascio di SQL Server 2017 (14.x), i file con valori delimitati da virgole (CSV) non sono supportati per le operazioni di importazione bulk in SQL Server. In alcuni casi, tuttavia, è possibile utilizzare un file CSV come file di dati per un'importazione bulk di dati in SQL Server. Per informazioni sui requisiti per l'importazione di dati da un file di dati CSV, vedere Preparare i dati per l'esportazione o l'importazione bulk.
Comportamento del log
Per informazioni su quando le operazioni di inserimento di righe eseguite dall'importazione bulk in SQL Server vengono registrate nel log delle transazioni, vedere Prerequisiti per la registrazione minima nell'importazione bulk. La registrazione minima non è supportata nel database SQL di Azure.
Limitazioni
Quando si usa un file di formato con BULK INSERT, è possibile specificare fino a 1.024 campi. Si tratta dello stesso numero massimo di colonne consentite in una tabella. Se si usa un file di formato con BULK INSERT un file di dati contenente più di 1.024 campi, BULK INSERT genera l'errore 4822.
L'utilità bcp non presenta questa limitazione, quindi per i file di dati che contengono più di 1.024 campi, usare BULK INSERT senza un file di formato o usare il comando bcp.
Considerazioni sulle prestazioni
Se il numero di pagine da scaricare in un singolo batch supera una soglia interna, è possibile che venga eseguita un'analisi completa del pool di buffer per identificare le pagine da scaricare durante il commit del batch. L'analisi completa può influire sulle prestazioni dell'importazione bulk. Un probabile caso di superamento della soglia interna si verifica quando un pool di buffer di grandi dimensioni è combinato a un sottosistema di I/O lento. Per evitare overflow del buffer in computer di grandi dimensioni, non usare l'hint TABLOCK (che rimuove le ottimizzazioni bulk) o usare una dimensione batch più piccola (che mantiene le ottimizzazioni bulk).
È consigliabile testare diverse dimensioni del batch con il carico dati effettivo in modo da individuare la soluzione più adatta. Tenere presente che le dimensioni del batch hanno implicazioni di rollback parziale. Se il processo ha esito negativo e prima di usarlo BULK INSERT di nuovo, potrebbe essere necessario eseguire ulteriori operazioni manuali per rimuovere una parte delle righe inserite correttamente, prima che si sia verificato un errore.
Con il database SQL di Azure è consigliabile aumentare temporaneamente il livello di prestazioni del database o dell'istanza prima dell'importazione se si importa un volume elevato di dati.
Sicurezza
Delega degli account di sicurezza (rappresentazione)
Se un utente usa un account di accesso SQL Server, viene usato il profilo di sicurezza dell'account del processo di SQL Server. Un accesso eseguito tramite l'autenticazione di SQL Server non può essere autenticato all'esterno del motore di database. Pertanto, quando un BULK INSERT comando viene avviato da un account di accesso tramite l'autenticazione di SQL Server, la connessione ai dati viene effettuata usando il contesto di sicurezza dell'account di processo di SQL Server (l'account usato dal servizio Motore di database di SQL Server).
Per leggere correttamente i dati di origine, è necessario concedere all'account usato dal motore di database di SQL Server l'accesso ai dati di origine. Di contro, se un utente di SQL Server esegue l'accesso utilizzando l'autenticazione di Windows, potrà leggere solo i file accessibili dall'account utente, indipendentemente dal profilo di sicurezza del processo di SQL Server.
Quando si esegue l'istruzione BULK INSERT usando sqlcmd o osql, da un computer, inserendo dati in SQL Server in un secondo computer e specificando un data_file nel terzo computer usando un percorso UNC, è possibile che venga visualizzato un errore 4861.
Per risolvere questo errore, usare l'autenticazione di SQL Server e specificare un account di accesso di SQL Server che usi il profilo di sicurezza dell'account del processo di SQL Server. In alternativa, configurare Windows in modo da consentire la delega degli account di sicurezza. Per informazioni sull'abilitazione di un account utente in modo che venga considerato attendibile per la delega, vedere la Guida di Windows.
Per altre informazioni su questo e altre considerazioni sulla sicurezza per l'uso BULK INSERTdi , vedere Usare BULK INSERT o OPENROWSET(BULK...) per importare dati in SQL Server.
Quando importi da Azure Storage e i dati non sono pubblici (accesso anonimo), crea una CREDENZIALE CON SCOPO DI DATABASE basata su una chiave SAS crittografata con una chiave master del database (DMK), e poi crea una sorgente di database esterna da usare nel tuo BULK INSERT comando.
In alternativa, creare un DATABASE SCOPED CREDENTIAL basato su MANAGED IDENTITY per autorizzare le richieste di accesso ai dati in account di archiviazione non pubblici. Quando si utilizza MANAGED IDENTITY, Azure Storage deve concedere permessi all'identità gestita dell'istanza aggiungendo il ruolo integrato di controllo accessi basato sul ruolo (RBAC) di Azure Blob Data Contributor che fornisce accesso di lettura/scrittura all'identità gestita per i contenitori necessari di Azure Storage. Istanza gestita di SQL di Azure dispone di un'identità gestita assegnata dal sistema e può avere anche una o più identità gestite assegnate dall'utente. È possibile usare identità gestite assegnate dal sistema o identità gestite assegnate dall'utente per autorizzare le richieste. Per l'autorizzazione, viene usata l'identità default dell'istanza gestita, ovvero l'identità gestita assegnata dall'utente primaria o l'identità gestita assegnata dal sistema se non viene specificata l'identità gestita assegnata dall'utente. Per un esempio, vedi Importa dati da un file in Azure Storage.
Importante
L'Identità gestita si applica ad Azure SQL, SQL Server 2025 (17.x) e versioni successive.
Autorizzazioni
Le autorizzazioni seguenti si applicano al percorso in cui i dati vengono importati in blocco (destinazione).
Richiede INSERT autorizzazioni e ADMINISTER BULK OPERATIONS . Nel database SQL di INSERT Azure sono necessarie autorizzazioni.ADMINISTER DATABASE BULK OPERATIONS
ADMINISTER BULK OPERATIONS le autorizzazioni o il ruolo bulkadmin non è supportato per SQL Server in Linux. Per SQL Server in Linux, gli inserimenti bulk possono essere eseguiti solo dal ruolo sysadmin.
Inoltre, ALTER TABLE l'autorizzazione è necessaria se una o più delle condizioni seguenti sono vere:
Esistono vincoli e l'opzione
CHECK_CONSTRAINTSnon è specificata.Per impostazione predefinita, i vincoli sono disabilitati. Per controllare i vincoli in modo esplicito, usare l'opzione
CHECK_CONSTRAINTS.I trigger esistono e l'opzione
FIRE_TRIGGERnon è specificata.Per impostazione predefinita, i trigger non sono attivati. Per attivare i trigger in modo esplicito, usare l'opzione
FIRE_TRIGGER.Usare l'opzione
KEEPIDENTITYper importare il valore Identity dal file di dati.
Esempi
Gli esempi di codice in questo articolo usano il database di esempio AdventureWorks2025 o AdventureWorksDW2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.
Importante
Azure SQL Database e Fabric Warehouse supportano solo la lettura da Azure Storage.
R. Usare le pipe per importare dati da un file
Nell'esempio seguente vengono importate informazioni dettagliate sugli ordini nella tabella AdventureWorks2022.Sales.SalesOrderDetail dal file di dati specificato, utilizzando una barra verticale (|) come carattere di terminazione del campo e la combinazione |\n come carattere di terminazione della riga.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');
B. Usare l'argomento FIRE_TRIGGERS
Nell'esempio seguente viene specificato l'argomento FIRE_TRIGGERS.
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);
C. Usare il carattere di avanzamento riga come carattere di terminazione della riga
Nell'esempio seguente viene importato un file che utilizza il carattere di avanzamento riga come carattere di terminazione della riga, come nel caso di output UNIX:
DECLARE @bulk_cmd AS VARCHAR (1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';
EXECUTE (@bulk_cmd);
Nota
In Windows, \n viene sostituito automaticamente con \r\n.
D. Definire una tabella codici
Nell'esempio che segue viene illustrato come specificare una tabella codici.
BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');
E. Importare dati da un file CSV
Nell'esempio che segue viene illustrato come specificare un file CSV ignorando l'intestazione (prima riga), usando ; come carattere di terminazione del campo e 0x0a come carattere di terminazione della riga:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
Nell'esempio che segue viene illustrato come specificare un file CSV nel formato UTF-8 (tramite un CODEPAGE di 65001) ignorando l'intestazione (prima riga), usando ; come carattere di terminazione del campo e 0x0a come carattere di terminazione della riga:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
CODEPAGE = '65001',
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
F. Importare dati da un file in Azure Storage
Carica dati da un CSV in Azure Storage con il token SAS
Il seguente esempio mostra come caricare dati da un file CSV in una posizione Azure Storage su cui hai creato una Shared Access Signature (SAS). La posizione Azure Storage è configurata come sorgente dati esterna, che richiede una credenziale con ambito di database utilizzando una chiave SAS criptata tramite un DMK nel database utente.
Nota
Assicurati di non avere un avviso ? nel token SAS, e di avere almeno il permesso di lettura sull'oggetto che dovrebbe essere caricato srt=o&sp=r, e che il periodo di scadenza sia valido (tutte le date sono in tempo UTC).
(Opzionale) Un DMK non è necessario se a DATABASE SCOPED CREDENTIAL non è richiesto, perché il blob è configurato per l'accesso pubblico (anonimo).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(Opzionale) A DATABASE SCOPED CREDENTIAL non è necessario perché il blob è configurato per l'accesso pubblico (anonimo).
Non includere un lead ? nel token SAS. Assicurati di avere almeno il permesso di lettura sull'oggetto che dovrebbe essere caricato (srt=o&sp=r), e che il periodo di scadenza sia valido (tutte le date sono in tempo UTC).
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '******srt = sco&sp = rwac&se = 2017-02-01T00:55:34Z&st = 2016-12-29T16:55:34Z***************';
Nota
CREDENTIAL Non è necessario se un blob è configurato per l'accesso pubblico (anonimo).
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Carica dati da un CSV in Azure Storage con un'identità gestita
Il seguente esempio mostra come utilizzare il BULK INSERT comando per caricare dati da un file CSV in una posizione Azure Storage usando Managed Identity. La posizione Azure Storage è configurata come sorgente dati esterna.
(Opzionale) Un DMK non è necessario se a DATABASE SCOPED CREDENTIAL non è richiesto, perché il blob è configurato per l'accesso pubblico (anonimo).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(Opzionale) A DATABASE SCOPED CREDENTIAL non è richiesto, perché il blob è configurato per l'accesso pubblico (anonimo):
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
Concedere il ruolo di Storage Blob Data Contributor, per fornire accesso di lettura/scrittura all'identità gestita per i contenitori necessari di Azure Storage.
Nota
CREDENTIAL Non è necessario se un blob è configurato per l'accesso pubblico (anonimo).
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
Importante
L'identità gestita si applica a SQL Server 2025 (17.x) e versioni successive, e ad Azure SQL.
G. Importa dati da un file in Azure Storage e specifica un file di errore
L'esempio seguente mostra come caricare dati da un file CSV in una posizione Azure Storage, configurata come sorgente dati esterna, e specifica anche un file di errore. È necessaria una credenziale con ambito database usando una firma di accesso condiviso. Se viene eseguito su Azure SQL Database, l'opzione ERRORFILE dovrebbe essere accompagnata da ERRORFILE_DATA_SOURCE, altrimenti l'importazione potrebbe fallire con errore di permessi. Il file specificato in ERRORFILE non deve esistere nel contenitore.
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices',
FORMAT = 'CSV',
ERRORFILE = 'MyErrorFile',
ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);
Per esempi completi BULK INSERT , inclusa la configurazione della credenziale e della sorgente di dati esterna, vedi Esempi di accesso di massa ai dati in Azure Storage.
Altri esempi
Altri esempi relativi a BULK INSERT sono disponibili negli articoli seguenti:
- Esempi di importazione e esportazione in massa di documenti XML
- Mantenere i valori di identità quando importi dati in massa
- Mantenere i valori nulli o predefiniti durante l'importazione in massa
- Specificare terminatori di campo e riga
- Usa un file di formattazione per importare dati in massa
- Usa il formato del carattere per importare o esportare dati
- Usa il formato nativo per importare o esportare dati
- Usa il formato di carattere Unicode per importare o esportare dati
- Usa il formato nativo Unicode per importare o esportare dati
- Usa un file di formattazione per saltare una colonna di tabella
- Usa un file di formato per mappare le colonne delle tabelle ai campi del file dati