Condividi tramite


Importare dati da Excel a SQL Server o al database SQL di Azure

Si applica a: SQL Server Database SQL di Azure

Sono disponibili vari modi per importare dati da file di Excel a SQL Server o al database SQL di Azure. Alcuni metodi consentono di importare dati in un unico passaggio direttamente dai file di Excel. Altri metodi richiedono l'esportazione dei dati di Excel in formato testo (file CSV) prima di poterli importare.

Questo articolo riepiloga i metodi usati di frequente e include collegamenti a informazioni più dettagliate. Una descrizione completa degli strumenti e dei servizi complessi come Azure Data Factory o SSIS esula dagli scopi di questo articolo. Per altre informazioni sulla soluzione a cui si è interessati, seguire i collegamenti indicati.

Elenco di metodi

Esistono vari modi per importare dati da Excel. Potrebbe essere necessario installare SQL Server Management Studio (SSMS) per usare alcuni di questi strumenti.

Per importare dati da Excel, è possibile usare gli strumenti seguenti:

Esportazione prima in formato testo (SQL Server e database SQL di Azure) Direttamente da Excel (solo SQL Server locale)
Procedura guidata Importa file flat Importazione/Esportazione guidata SQL Server
Istruzione BULK INSERT SQL Server Integration Services (SSIS)
Strumento di copia bulk (bcp) Funzione OPENROWSET
Copia guidata (Azure Data Factory)
Azure Data Factory

Se si vogliono importare più fogli di lavoro da una cartella di lavoro di Excel, è generalmente necessario eseguire uno di questi strumenti una volta per ogni foglio.

Per altre informazioni, vedere Limitazioni e problemi noti per il caricamento dei dati da o verso file di Excel.

Importazione/Esportazione guidata

Importare i dati direttamente dai file di Excel usando Importazione/Esportazione guidata SQL Server. È anche possibile salvare le impostazioni come pacchetto di SQL Server Integration Services (SSIS) che è possibile personalizzare e riusare in seguito.

  1. In SQL Server Management Studio connettersi a un'istanza del motore di database di SQL Server.

  2. Espandere Database.

  3. Fare clic con il pulsante destro del mouse su un database.

  4. Seleziona Tasks.

  5. Scegliere l'opzione Importa dati o Esporta dati:

    Screenshot della procedura guidata di avvio di SSMS.

Verrà avviata la procedura guidata:

Screenshot di Connetti a un'origine dati Excel.

Per altre informazioni, vedere gli articoli seguenti:

Integration Services (SSIS)

Se si ha familiarità con SQL Server Integration Services (SSIS) e si preferisce non eseguire l'Importazione/Esportazione guidata di SQL Server, è possibile creare un pacchetto SSIS che usi invece Excel come origine e SQL Server come destinazione nel flusso di dati.

Per altre informazioni, vedere gli articoli seguenti:

Per istruzioni su come creare pacchetti SSIS, vedere l'esercitazione Creazione di un pacchetto ETL.

Screenshot dei componenti nel flusso di dati.

OPENROWSET e server collegati

Importante

Nel database SQL di Azure non è possibile eseguire l'importazione direttamente da Excel. È necessario prima di tutto esportare i dati in un file di testo (CSV).

Il provider ACE (in precedenza provider Jet) che si connette alle origini dati di Excel è destinato all'uso interattivo sul lato client. Se si usa il provider ACE in SQL Server, in particolare in processi automatizzati o processi in esecuzione in parallelo, si possono ottenere risultati imprevisti.

Query distribuite

Importare i dati direttamente in SQL Server dai file di Excel usando la funzione OPENROWSET o OPENDATASOURCE di Transact-SQL. Questo utilizzo è noto come query distribuita.

Importante

Nel database SQL di Azure non è possibile eseguire l'importazione direttamente da Excel. È necessario prima di tutto esportare i dati in un file di testo (CSV).

Prima di eseguire una query distribuita, è necessario abilitare l'opzione di configurazione del server Ad Hoc Distributed Queries, come illustrato nell'esempio seguente. Per ulteriori informazioni, vedere Configurazione del server: query distribuite ad hoc.

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

L'esempio di codice seguente usa OPENROWSET per importare i dati dal foglio di lavoro di Excel Sheet1 in una nuova tabella di database.

USE ImportFromExcel;
GO
SELECT * INTO Data_dq
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0; Database=C:\Temp\Data.xlsx', [Sheet1$]);
GO

Ecco lo stesso esempio con OPENDATASOURCE.

USE ImportFromExcel;
GO
SELECT * INTO Data_dq
FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\Temp\Data.xlsx;Extended Properties=Excel 12.0')...[Sheet1$];
GO

Per aggiungere i dati importati a una tabella esistente invece di creare una nuova tabella, usare la sintassi INSERT INTO ... SELECT ... FROM ... al posto della sintassi SELECT ... INTO ... FROM ... usata negli esempi precedenti.

Per eseguire una query sui dati di Excel senza eseguirne l'importazione, usare la sintassi standard SELECT ... FROM ....

Per altre informazioni sulle query distribuite, vedi gli articoli seguenti:

1 Le query distribuite sono ancora supportate in SQL Server, ma la documentazione relativa a questa funzionalità non è stata aggiornata.

Server collegati

È anche possibile configurare una connessione permanente da SQL Server al file di Excel come server collegato. L'esempio seguente importa i dati dal foglio di lavoro Data nel server collegato di Excel esistente EXCELLINK in una nuova tabella di database di SQL Server denominata Data_ls.

USE ImportFromExcel;
GO
SELECT * INTO Data_ls FROM EXCELLINK...[Data$];
GO

È possibile creare un server collegato da SQL Server Management Studio (SSMS) o eseguendo la stored procedure di sistema sp_addlinkedserver, come illustrato nell'esempio seguente.

DECLARE @RC INT;
DECLARE @server NVARCHAR(128);
DECLARE @srvproduct NVARCHAR(128);
DECLARE @provider NVARCHAR(128);
DECLARE @datasrc NVARCHAR(4000);
DECLARE @location NVARCHAR(4000);
DECLARE @provstr NVARCHAR(4000);
DECLARE @catalog NVARCHAR(128);

-- Set parameter values
SET @server = 'EXCELLINK';
SET @srvproduct = 'Excel';
SET @provider = 'Microsoft.ACE.OLEDB.12.0';
SET @datasrc = 'C:\Temp\Data.xlsx';
SET @provstr = 'Excel 12.0';

EXEC @RC = [master].[dbo].[sp_addlinkedserver] @server,
    @srvproduct,
    @provider,
    @datasrc,
    @location,
    @provstr,
    @catalog;

Per altre informazioni sui server collegati, vedi gli articoli seguenti:

Per altri esempi e informazioni sia sui server collegati che sulle query distribuite, vedi l’articolo seguente:

Prerequisiti

Per usare i restanti metodi descritti in questa pagina, ovvero l'istruzione BULK INSERT, lo strumento bcp o Azure Data Factory, è prima di tutto necessario esportare i dati di Excel in un file di testo.

Salvare i dati di Excel come testo

In Excel selezionare File | Salva con nome e quindi selezionare Testo (delimitato da tabulazioni) (*.txt) o CSV (delimitato da virgole) (*.csv) come tipo di file di destinazione.

Se vuoi esportare più fogli di lavoro dalla cartella di lavoro, seleziona ogni foglio e ripeti questa procedura. Il comando Salva con nome esporta solo il foglio attivo.

Suggerimento

Per ottenere risultati ottimali con gli strumenti per l'importazione dei dati, salvare fogli che contengono solo le intestazioni di colonna e le righe di dati. Se i dati salvati contengono titoli di pagina, righe vuote, note e così via, possono verificarsi risultati imprevisti in un secondo momento quando si importano i dati.

Procedura guidata Importa file flat

È possibile importare i dati salvati come file di testo seguendo le varie pagine della procedura guidata Importa file flat.

Come descritto in precedenza nella sezione Prerequisiti, è necessario esportare i dati Excel come testo prima di poter usare la procedura guidata Importa file flat per eseguire l'importazione.

Per altre informazioni sulla procedura guidata Importa File Flat, vedere Procedura guidata per l'importazione di file flat in SQL.

Comando BULK INSERT

BULK INSERT è un comando Transact-SQL che è possibile eseguire da SQL Server Management Studio. L'esempio seguente carica i dati dal file con valori delimitati da virgole Data.csv in una tabella di database esistente.

Come descritto in precedenza nella sezione Prerequisiti, è necessario esportare i dati Excel come testo prima di usare BULK INSERT per eseguire l'importazione. BULK INSERT non legge direttamente i file di Excel. Con il comando BULK INSERT, è possibile importare un file CSV archiviato localmente o in Archiviazione BLOB di Azure.

USE ImportFromExcel;
GO
BULK INSERT Data_bi FROM 'C:\Temp\data.csv'
   WITH (
      FIELDTERMINATOR = ',',
      ROWTERMINATOR = '\n'
);
GO

Per altre informazioni ed esempi per SQL Server e il database SQL di Azure, vedi gli articoli seguenti:

Strumento di copia bulk (bcp)

Lo strumento bcp viene eseguito dal prompt dei comandi. L'esempio seguente carica i dati dal file con valori delimitati da virgole Data.csv nella tabella di database Data_bcp esistente.

Come descritto in precedenza nella sezione Prerequisiti, è necessario esportare i dati Excel come testo prima di usare bcp per eseguire l'importazione. Lo strumento bcp non può leggere direttamente i file Excel. Usarlo per eseguire l'importazione in SQL Server o nel database SQL da un file di testo (CSV) salvato nella risorsa di archiviazione locale.

Importante

Per un file di testo (CSV) archiviato in Archiviazione BLOB di Azure, usare BULK INSERT o OPENROWSET. Per un esempio, vedere Usare BULK INSERT o OPENROWSET(BULK...) per importare dati in SQL Server.

bcp.exe ImportFromExcel..Data_bcp in "C:\Temp\data.csv" -T -c -t ,

Per altre informazioni su bcp, vedere i seguenti articoli:

Copia guidata (ADF)

È possibile importare i dati salvati come file di testo seguendo le varie pagine della Copia guidata di Azure Data Factory (ADF).

Come descritto in precedenza nella sezione Prerequisiti, è necessario esportare i dati Excel come testo prima di usare Azure Data Factory per eseguire l'importazione. Azure Data Factory non legge direttamente i file di Excel.

Per altre informazioni sulla Copia guidata, vedi i seguenti articoli:

Azure Data Factory

Se si ha familiarità con Azure Data Factory e si preferisce non eseguire la Copia guidata, creare una pipeline con un'attività di copia dal file di testo a SQL Server o al database SQL di Azure.

Come descritto in precedenza nella sezione Prerequisiti, è necessario esportare i dati Excel come testo prima di usare Azure Data Factory per eseguire l'importazione. Azure Data Factory non legge direttamente i file di Excel.

Per altre informazioni sull'uso di questi sink e origini di Data Factory, vedi gli articoli seguenti:

Per istruzioni su come copiare dati con Azure Data Factory, vedi gli articoli seguenti:

Errori comuni

Microsoft.ACE.OLEDB.12.0" non è stato registrato

Questo errore si verifica perché non è installato il provider OLE DB. Installarlo da Microsoft Access Database Engine 2016 Redistributable. Assicurarsi di installare la versione a 64 bit se Windows e SQL Server sono entrambi a 64 bit.

Testo dell'errore completo:

Msg 7403, Level 16, State 1, Line 3
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.

Impossibile creare un'istanza del provider OLE DB "Microsoft.ACE.OLEDB.12.0" per il server collegato "(null)"

Questo errore indica che Microsoft OLEDB non è stato configurato correttamente. Eseguire il codice Transact-SQL seguente per risolvere il problema:

EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1;
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1;

Testo dell'errore completo:

Msg 7302, Level 16, State 1, Line 3
Cannot create an instance of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

Impossibile caricare il provider OLE DB a 32 bit "Microsoft.ACE.OLEDB.12.0" in-process in SQL Server a 64 bit

Questo errore si verifica quando si installa una versione a 32 bit del provider OLE DB con SQL Server a 64 bit. Per risolvere questo problema, disinstallare la versione a 32 bit e installare la versione a 64 bit del provider OLE DB.

Testo dell'errore completo:

Msg 7438, Level 16, State 1, Line 3
The 32-bit OLE DB provider "Microsoft.ACE.OLEDB.12.0" cannot be loaded in-process on a 64-bit SQL Server.

Il provider OLE DB "Microsoft.ACE.OLEDB.12.0" per il server collegato "(null)" ha segnalato un errore

Questo errore indica in genere un problema di autorizzazioni tra il processo di SQL Server e il file. Verificare che l'account che esegue il servizio SQL Server abbia l'autorizzazione di accesso completo al file. È consigliabile evitare di cercare di importare i file dal desktop.

Testo dell'errore completo:

Msg 7399, Level 16, State 1, Line 3
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error. The provider did not give any information about the error.

Impossibile inizializzare l'oggetto di origine dei dati del provider OLE DB "Microsoft.ACE.OLEDB.12.0" per il server collegato "(null)"

Questo errore indica in genere un problema di autorizzazioni tra il processo di SQL Server e il file. Verificare che l'account che esegue il servizio SQL Server abbia l'autorizzazione di accesso completo al file. È consigliabile evitare di cercare di importare i file dal desktop.

Testo dell'errore completo:

Msg 7303, Level 16, State 1, Line 3
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".