適用於:
SQL Server(所有支持的版本)
將 Excel 文件中的數據導入 SQL Server數據庫的方法有多種。 某些方法允許你在單個步驟中從 Excel 文件直接導入數據,其他方法要求在導入數據前,必須將 Excel 數據先導出為文本 (CSV 文件)。 本文總結了常用的方法,並提供有關更為詳細的信息的鏈接。
一、方法列表
可使用以下工具從 Excel 導入數據:
直接從 Excel(僅本地 SQL Server)進行 | 首先導出到文本(SQL Server 和 SQL 數據庫) |
---|---|
SQL Server 導入和導出向導 | 導入平面文件向導 |
SQL Server Integration Services (SSIS) | BULK INSERT 語句 |
OPENROWSET 函數 |
BCP |
如果要從 Excel 工作簿導入多個工作表,通常必須為每個工作表運行一次其中任何工具。
SSIS 或 Azure 數據工廠等復雜工具和服務的完整描述不屬於本表的范圍。 要詳細了解感興趣的解決方案,請單擊所提供的鏈接。
重要
有關連接到 Excel 文件的詳細信息,以及從 Excel 文件加載數據或將數據加載到 Excel 文件的限制和已知問題,請參閱使用 SQL Server Integration Services (SSIS) 從 Excel 加載數據或將數據加載到 Excel 中。
如果尚未安裝 SQL Server,或已具有 SQL Server 但未安裝 SQL Server Management Studio,請參閱 下載 SQL Server Management Studio (SSMS)。
二、SQL Server 導入和導出向導(僅本地 SQL Server)
通過單步執行 SQL Server 導入和導出向導各頁面,直接從 Excel 文件導入數據。 (可選)將設置保存為可以稍后自定義和重用的 SQL Server Integration Services (SSIS) 包。
-
在 SQL Server Management Studio 中,連接到 SQL Server 數據庫引擎 的實例。
-
展開 “數據庫” 。
-
右鍵單擊某個數據庫。
-
指向“任務” 。
-
單擊以下選項之一。
-
導入數據
-
導出數據
有關使用向導將 Excel 導數據入 SQL Server 的示例,請參閱從導入和導出向導的這個簡單示例入手。
要了解“導入和導出”向導的其他啟動方法,請參閱啟動 SQL Server 導入和導出向導。
三、 SQL Server Integration Services (SSIS)(僅本地 SQL Server)
如果熟悉 SSIS,並且不想運行 SQL Server 導入和導出向導,請創建在數據流中使用 Excel 源和 SQL Server 目標的 SSIS 包。
有關這些 SSIS 組件的詳細信息,請參閱以下主題:
若要開始學習如何生成 SSIS 包,請參閱教程如何創建 ETL 包。
四、 OPENROWSET 和鏈接服務器(僅本地 SQL Server)
重要
在 Azure SQL 數據庫中,無法直接從 Excel 導入。 必須首先將數據導出到文本 (CSV) 文件。 有關示例,請參閱示例。
備注
連接到 Excel 數據源的 ACE 提供程序(前身為 Jet 提供程序)旨在用於交互式客戶端用途。 如果在 SQL Server 上使用 ACE 提供程序,尤其是在自動進程或並行運行的進程中,可能會發生意外結果。
1、分布式查詢
使用 Transact-SQL OPENROWSET
或 OPENDATASOURCE
函數直接從 Excel 文件導入 SQL Server。 這種用法稱為“分布式查詢” 。
重要
在 Azure SQL 數據庫中,無法直接從 Excel 導入。 必須首先將數據導出到文本 (CSV) 文件。 有關示例,請參閱示例。
必須先啟用 ad hoc distributed queries
服務器配置選項(如以下示例所示),然后才能運行分布式查詢。 有關詳細信息,請參閱即席分布式查詢服務器配置選項。
sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO
下面的代碼示例使用 OPENROWSET
,將 Excel Sheet1
工作表中的數據導入新的數據庫表。
USE ImportFromExcel;
GO
SELECT * INTO Data_dq
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0; Database=C:\Temp\Data.xlsx', [Sheet1$]);
GO
下面的示例用途相同,區別在於使用的是 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
若要將導入的數據追加 到現有 表,而不是新建表,請使用 INSERT INTO ... SELECT ... FROM ...
語法,而不是上面示例中使用的 SELECT ... INTO ... FROM ...
語法。
若要查詢(而不是導入)Excel 數據,只需使用標准 SELECT ... FROM ...
語法。
有關分布式查詢的詳細信息,請參閱以下主題:
- 分布式查詢(SQL Server 2016 仍支持分布式查詢,但此功能的相關文檔尚未更新。)
- OPENROWSET
- OPENDATASOURCE
2、鏈接服務器
還可以將從 SQL Server 到 Excel 文件的永久性連接配置為鏈接服務器 。 下面的示例將現有 Excel 鏈接服務器 EXCELLINK
上的 Data
工作表數據導入名為 Data_ls
的新 SQL Server 數據庫表。
USE ImportFromExcel;
GO
SELECT * INTO Data_ls FROM EXCELLINK...[Data$];
GO
可以通過 SQL Server Management Studio 或運行系統存儲過程 sp_addlinkedserver
(如以下示例所示)創建鏈接服務器。
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
有關鏈接服務器的詳細信息,請參閱以下主題:
有關鏈接服務器和分布式查詢的更多示例和詳細信息,請參閱以下主題:
五、先決條件 - 將 Excel 數據保存為文本
若要使用本頁上的其他方法(BULK INSERT 語句、BCP 工具或 Azure 數據工廠),必須先將 Excel 數據導出到文本文件中。
在 Excel 中,依次選擇“文件”|“另存為”,再選擇“文本文件(制表符分隔)(.txt)”或“CSV (逗號分隔)(.csv)”作為目標文件類型 * * 。
如果要從工作簿中導出多個工作表,請選擇每個工作表,然后重復此過程。 “另存為”命令僅導出活動工作表 。
提示
為在使用數據導入工具時獲得最佳結果,保存僅包含列標題和數據行的工作表。 如果保存的數據包含頁標題、空白行、注釋等,稍后可能會在導入數據時發生意外結果。
六、 導入平面文件向導
通過單步執行導入平面文件向導各頁面,導入保存為文本文件的數據。
如前面先決條件部分中所述,必須先將 Excel 數據導出為文本,然后才能使用導入平面文件向導導入它。
有關導入平面文件向導的詳細信息,請參閱將平面文件導入到 SQL 向導。
七、 BULK INSERT 命令
BULK INSERT
是可以通過 SQL Server Management Studio 運行的 Transact-SQL 命令。 下面的示例將 Data.csv
逗號分隔文件中的數據加載到現有數據庫表中。
如前面先決條件部分中所述,必須先將 Excel 數據導出為文本,然后才能使用 BULK INSERT 導入它。 BULK INSERT 無法直接讀取 Excel 文件。 使用 BULK INSERT 命令,可以導入存儲在本地或在 Azure Blob 存儲中的 CSV 文件。
USE ImportFromExcel;
GO
BULK INSERT Data_bi FROM 'C:\Temp\data.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
GO
有關 SQL Server 和 SQL 數據庫的詳細信息和示例,請參閱以下主題:
八、 BCP 工具
BCP 是通過命令提示符運行的程序。 下面的示例將 Data.csv
逗號分隔文件中的數據加載到現有 Data_bcp
數據庫表中。
如前面先決條件部分中所述,必須先將 Excel 數據導出為文本,然后才能使用 BCP 導入它。 BCP 無法直接讀取 Excel 文件。 用於從保存在本地存儲的測試 (CSV) 文件中導入 SQL Server 或 SQL 數據庫。
重要
對於存儲在 Azure Blob 存儲中的文本 (CSV) 文件,請使用 BULK INSERT 或 OPENROWSET。 有關示例,請參閱示例。
bcp.exe ImportFromExcel..Data_bcp in "C:\Temp\data.csv" -T -c -t ,
有關 BCP 的詳細信息,請參閱以下主題:
九、常見錯誤
1、Microsoft.ACE.OLEDB.12.0 尚未注冊
發生此錯誤的原因是未安裝 OLEDB 提供程序。 請通過 Microsoft Access 數據庫引擎 2010 可再發行組件進行安裝。 如果 Windows 和 SQL Server 都是 64 位,請務必安裝 64 位版本。
完整錯誤為:
Msg 7403, Level 16, State 1, Line 3
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.
2、無法為鏈接服務器 "(null)" 創建 OLE DB 提供程序 "Microsoft.ACE.OLEDB.12.0" 的實例
這表示 Microsoft OLEDB 配置錯誤。 運行以下 Transact-SQL 代碼可解決此問題:
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
完整錯誤為:
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)".
3、32 位 OLE DB 提供程序 "Microsoft.ACE.OLEDB.12.0" 無法在 64 位 SQL Server 上的進程內加載
32 位版本的 OLD DB 提供程序與 64 位 SQL Server 一起安裝時,會發生此情況。 要解決此問題,請卸載 32 位版本,改為安裝 64 位版本的 OLE DB 提供程序。
完整錯誤為:
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.
4、鏈接服務器 "(null)" 的 OLE DB 提供程序 "Microsoft.ACE.OLEDB.12.0" 報告了錯誤。 提供程序未給出有關錯誤的任何信息
5、無法初始化鏈接服務器 "(null)" 的 OLE DB 提供程序 "Microsoft.ACE.OLEDB.12.0" 的數據源對象
這兩個錯誤通常表示 SQL Server 進程和文件之間存在權限問題。 請確保運行 SQL Server 服務的帳戶對文件具有完全訪問權限。 建議不要嘗試從桌面導入文件。
完整錯誤為:
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.
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)".
十、另請參閱
使用 SQL Server Integration Services (SSIS) 將數據導入 Excel 或從 Excel 導出數據