1. 程式人生 > 實用技巧 >將 Excel 資料匯入 SQL Server資料庫

將 Excel 資料匯入 SQL Server資料庫

原文:https://docs.microsoft.com/zh-cn/sql/relational-databases/import-export/import-data-from-excel-to-sql?view=sql-server-2017#bulk-insert


適用於: SQL Server(所有支援的版本)

將 Excel 檔案中的資料匯入 SQL Server資料庫的方法有多種。 某些方法允許你在單個步驟中從 Excel 檔案直接匯入資料,其他方法要求在匯入資料前,必須將 Excel 資料先匯出為文字 (CSV 檔案)。 本文總結了常用的方法,並提供有關更為詳細的資訊的連結。

一、方法列表

可使用以下工具從 Excel 匯入資料:

首先匯出到文字(SQL Server 和 SQL 資料庫) 直接從 Excel(僅本地 SQL Server)進行
匯入平面檔案嚮導 SQL Server 匯入和匯出嚮導
BULK INSERT 語句 SQL Server Integration Services (SSIS)
BCP OPENROWSET 函式

如果要從 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 匯入和匯出嚮導各頁面,直接從 Excel 檔案匯入資料。 (可選)將設定儲存為可以稍後自定義和重用的 SQL Server Integration Services (SSIS) 包。

  1. SQL Server Management Studio 中,連線到 SQL Server 資料庫引擎 的例項。

  2. 展開 “資料庫”

  3. 右鍵單擊某個資料庫。

  4. 指向“任務” 。

  5. 單擊以下選項之一。

  • 匯入資料

  • 匯出資料

有關使用嚮導將 Excel 導資料入 SQL Server 的示例,請參閱從匯入和匯出嚮導的這個簡單示例入手

要了解“匯入和匯出”嚮導的其他啟動方法,請參閱啟動 SQL Server 匯入和匯出嚮導

三、 SQL Server Integration Services (SSIS)

如果熟悉 SSIS,並且不想執行 SQL Server 匯入和匯出嚮導,請建立在資料流中使用 Excel 源和 SQL Server 目標的 SSIS 包。

有關這些 SSIS 元件的詳細資訊,請參閱以下主題:

若要開始學習如何生成 SSIS 包,請參閱教程如何建立 ETL 包

四、 OPENROWSET 和連結伺服器

重要

在 Azure SQL 資料庫中,無法直接從 Excel 匯入。 必須首先將資料匯出到文字 (CSV) 檔案。 有關示例,請參閱示例

備註

連線到 Excel 資料來源的 ACE 提供程式(前身為 Jet 提供程式)旨在用於互動式客戶端用途。 如果在 SQL Server 上使用 ACE 提供程式,尤其是在自動程序或並行執行的程序中,可能會發生意外結果。

1、分散式查詢

使用 Transact-SQL OPENROWSETOPENDATASOURCE 函式直接從 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 ... 語法。

有關分散式查詢的詳細資訊,請參閱以下主題:

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 匯出資料