BULK INSERT: come importare file csv su SQL Server

inserimento dati con bulk insert

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 ad utilizzare correttamente il parametro FIRSTROW, come mostreremo nel paragrafo successivo il valore da scegliere può risultare in alcuni casi contro-intuitivo.

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://raw.githubusercontent.com/iantomasinicola/Machine-Learning-con-SQL/main/IrisDataset.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.Iris(
Rownumber INT PRIMARY KEY 
          NOT NULL,
sepal_length DECIMAL(18,4),
sepal_width DECIMAL(18,4),
petal_length DECIMAL(18,4),
petal_width DECIMAL(18,4),
class VARCHAR(255) NOT NULL);

e scrivere il codice della BULK Insert in questo modo

BULK INSERT dbo.Iris
FROM 'C:\Desktop\IrisDataset.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n');

Sottolineo come anche in questo caso il parametro FIRSTROW deve essere configurato con il valore 2.

 

Articoli correlati

Torna su