La Bulk Insert è un’istruzione T-SQL che permette di importare facilmente un file csv all’interno di una tabella del database relazionale SQL Server. Si tratta di un’operazione molto frequente nei processi di ETL e caricamento dei database, in questo articolo vedremo come utilizzarla correttamente.
Come scrivere una Bulk Insert su SQL Server
La sintassi T-SQL per utilizzare l’istruzione Bulk Insert prevede tre clausole principali:
- BULK INSERT seguito dal nome della tabella all’interno del quale vogliamo importare i dati;
- FROM seguito dal file contenente i dati;
- WITH che contiene i parametri da configurare per leggere il file.
Risulta importante precisare che la tabella utilizzata nel codice deve esistere già, inoltre deve possedere una struttura coerente con quello che sarà il contenuto del file da importare, ponendo particolare attenzione all’ordine e ai tipi delle colonne.
Il file inserito nella clausola FROM deve essere presente su un server accessibile dal database. Non posso utilizzare la Bulk Insert per leggere ad esempio un file salvato su GitHub come con Pandas (in questo mio articolo trovi un approfondimento sulle procedure di acquisizione dei file con Python e Pandas https://www.yimp.it/import-dati-python-e-pandas/).
Novità: da SQL Server 2017 (14.x) è possibile acquisire in alcune circostanze file salvati su Azure. Vi lascio il link alla documentazione ufficiale Microsoft: https://docs.microsoft.com/it-it/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-ver16#f-import-data-from-a-file-in-azure-blob-storage.
Configurare la clausola WITH della Bulk Insert
I parametri utilizzati più frequentemente nella clausola WITH sono:
- FIRSTROW che generalmente imposterete a 2 per saltare la prima riga contenente l’intestazione;
- FIELDTERMINATOR per impostare il carattere separatore utilizzato all’interno del file CSV (nella maggior parte dei casi si tratterà della virgola, del punto e virgola o della tabulazione);
- ROWTERMINATOR per indicare il carattere di fine riga. Su sistema operativo Windows specificherete quasi sempre il valore ‘\n’.
Attenzione a utilizzare correttamente il parametro FIRSTROW, come mostreremo nel paragrafo successivo il valore da scegliere può risultare in alcuni casi controintuitivo.
Vi ricordo infine che una volta importato il file all’interno di una tabella di un database relazionale, non esisterà più un concetto implicito di “ordine delle righe”. Per tenere traccia della posizione dei dati all’interno del file di partenza, è necessario che il file di input stesso contenga una colonna con questa informazione.
Un esempio di codice che effettua una Bulk Insert
Vediamo il codice necessario per importare il file contenuto all’interno di questo file https://github.com/iantomasinicola/Esercizi/blob/main/Fornitori.csv
Come detto in precedenza, è essenziale per prima cosa salvare manualmente il file su un server accessibile dal motore di Database (se ad esempio avete un’installazione locale di SQL Server, vi basterà scaricare il file sul vostro Desktop).
A questo punto potrete creare una tabella con una struttura coerente con il contenuto del file
CREATE TABLE dbo.Fornitori(
NumeroFornitore INT PRIMARY KEY NOT NULL,
Denominazione VARCHAR(250) NULL,
RegioneResidenza VARCHAR(250) NULL,
DataPrimaAcquisto VARCHAR(50) NULL,
FornitoreAttivo INT NULL,
DataFineContratto VARCHAR(50) NULL);
e scrivere il codice della BULK Insert in questo modo
BULK INSERT dbo.Iris
FROM 'C:\Desktop\Fornitori.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n');
Articoli correlati
- Segui la lezione successiva sul paradigma ETL
- Torna all’indice delle lezioni
- Visita la pagina del mio videocorso SQL