有多种方法可用于将 Excel 文件中的数据导入 SQL Server 或 Azure SQL 数据库。 利用某些方法,可在单个步骤中直接从 Excel 文件导入数据;其他方法要求将 Excel 数据先导出为文本(CSV 文件),然后才能将其导入。
本文汇总了常用的方法,并提供有关更详细信息的链接。 本文不包括 SSIS 或 Azure 数据工厂等复杂工具和服务的完整描述。 有关感兴趣的解决方案的详细信息,请点击提供的链接。
方法列表
可采用多种方式从 Excel 导入数据。 若要使用其中一些工具,需要安装 SQL Server Management Studio (SSMS)。
可以使用以下工具从 Excel 导入数据:
首先导出为文本(SQL Server 和 Azure SQL 数据库) | 直接从 Excel(仅本地 SQL Server)进行 |
---|---|
导入平面文件向导 | SQL Server 导入和导出向导 |
BULK INSERT 语句 | SQL Server Integration Services (SSIS) |
批量复制工具 (bcp) | OPENROWSET 函数 |
复制向导(Azure 数据工厂) | |
Azure 数据工厂 |
如果要从 Excel 工作簿导入多个工作表,通常必须为每个工作表运行其中任一工具一次。
有关详细信息,请参阅将数据加载到 Excel 文件或从 Excel 文件加载数据的限制和已知问题。
导入和导出向导
使用 SQL Server 导入和导出向导直接从 Excel 文件导入数据。 还可以将设置保存为可以稍后自定义和重用的 SQL Server Integration Services (SSIS) 包。
在 SQL Server Management Studio 中,连接到 SQL Server 数据库引擎 的实例。
展开“数据库”。
右键单击某个数据库。
选择“任务”。
选择“导入数据”或“导出数据”:
这将启动向导:
有关详细信息,请参阅下列文章:
Integration Services (SSIS)
如果熟悉 SQL Server Integration Services (SSIS),并且不希望运行 SQL Server 导入和导出向导,则可以创建 SSIS 包,以在数据流中改用 Excel 源和 SQL Server 目标。
有关详细信息,请参阅下列文章:
若要开始了解如何生成 SSIS 包,请参阅教程如何创建 ETL 包。
OPENROWSET 和链接服务器
重要说明
在 Azure SQL 数据库中,无法直接从 Excel 导入。 必须首先将数据导出到文本 (CSV) 文件。
以下示例使用 JET 提供程序。 连接到 Excel 数据源的 Office 随附的 ACE 提供程序适用于交互式客户端使用,这可能会导致非交互式使用时出现意外结果。
分布式查询
使用 Transact-SQL OPENROWSET
或 OPENDATASOURCE
函数直接将数据从 Excel 文件导入 SQL Server。 这种用法称为分布式查询。
重要说明
在 Azure SQL 数据库中,无法直接从 Excel 导入。 必须首先将数据导出到文本 (CSV) 文件。
如以下示例所示,必须先启用 Ad Hoc Distributed Queries
服务器配置选项,然后才能运行分布式查询。 有关详细信息,请参阅服务器配置:即席分布式查询。
EXECUTE sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
EXECUTE sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO
以下代码示例使用 OPENROWSET
,将 Excel Sheet1
工作表中的数据导入新数据库表。
USE ImportFromExcel;
GO
SELECT * INTO Data_dq
FROM OPENROWSET('Microsoft.JET.OLEDB.4.0',
'Excel 8.0; Database=C:\Temp\Data.xls', [Sheet1$]);
GO
下面的示例用途相同,区别在于使用的是 OPENDATASOURCE
。
USE ImportFromExcel;
GO
SELECT * INTO Data_dq
FROM OPENDATASOURCE('Microsoft.JET.OLEDB.4.0',
'Data Source=C:\Temp\Data.xls;Extended Properties=Excel 8.0')...[Sheet1$];
GO
若要将导入的数据追加到现有表,而不是新建表,请使用 INSERT INTO ... SELECT ... FROM ...
语法,而不使用上面示例中使用的 SELECT ... INTO ... FROM ...
语法。
若要查询(而不是导入)Excel 数据,只需使用标准 SELECT ... FROM ...
语法。
有关分布式查询的详细信息,请参阅以下文章:
1 SQL Server 仍支持分布式查询,但此功能的相关文档未更新。
链接的服务器
还可以将从 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 (SSMS) 或运行系统存储过程 sp_addlinkedserver
(如以下示例所示)创建链接服务器。
DECLARE @RC AS INT;
DECLARE @server AS NVARCHAR (128);
DECLARE @srvproduct AS NVARCHAR (128);
DECLARE @provider AS NVARCHAR (128);
DECLARE @datasrc AS NVARCHAR (4000);
DECLARE @location AS NVARCHAR (4000);
DECLARE @provstr AS NVARCHAR (4000);
DECLARE @catalog AS NVARCHAR (128);
-- Set parameter values
SET @server = 'EXCELLINK';
SET @srvproduct = 'Excel';
SET @provider = 'Microsoft.JET.OLEDB.4.0';
SET @datasrc = 'C:\Temp\Data.xls';
SET @provstr = 'Excel 8.0';
EXECUTE
@RC = [master].[dbo].[sp_addlinkedserver]
@server,
@srvproduct,
@provider,
@datasrc,
@location,
@provstr,
@catalog;
有关链接服务器的详细信息,请参阅以下文章:
有关链接服务器和分布式查询的更多示例和详细信息,请参阅以下文章:
先决条件
若要使用本页面上介绍的其他方法(BULK INSERT
语句、bcp 工具或 Azure 数据工厂),必须先将 Excel 数据导出为文本文件。
将 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 和 Azure SQL 数据库的详细信息和示例,请参阅以下文章:
批量复制工具 (bcp)
从命令提示符运行 bcp 工具。 以下示例将数据从 Data.csv
逗号分隔文件加载到现有 Data_bcp
数据库表。
如前面先决条件部分中所述,必须先将 Excel 数据导出为文本,然后才能使用 bcp 将其导入。 bcp 工具无法直接读取 Excel 文件。 用于从保存到本地存储的测试 (CSV) 文件中导入 SQL Server 或 SQL 数据库。
重要说明
对于存储在 Azure Blob 存储中的文本 (CSV) 文件,请使用 BULK INSERT
或 OPENROWSET
。 有关示例,请参阅使用 BULK INSERT 或 OPENROWSET(BULK...) 将数据导入 SQL Server。
bcp.exe ImportFromExcel..Data_bcp in "C:\Temp\data.csv" -T -c -t ,
有关 bcp 的详细信息,请参阅以下文章:
复制向导 (ADF)
通过逐步执行 Azure 数据工厂 (ADF) 复制向导的各个页面,导入保存为文本文件的数据。
如前面先决条件部分中所述,必须先将 Excel 数据导出为文本,然后才能使用 Azure 数据工厂将其导入。 数据工厂无法直接读取 Excel 文件。
有关复制向导的详细信息,请参阅以下文章:
Azure 数据工厂
如果熟悉 Azure 数据工厂,并且不希望运行复制向导,请创建带有复制活动的管道,用于从文本文件复制到 SQL Server 或 Azure SQL 数据库。
如前面先决条件部分中所述,必须先将 Excel 数据导出为文本,然后才能使用 Azure 数据工厂将其导入。 数据工厂无法直接读取 Excel 文件。
若要详细了解如何使用这些数据工厂源和接收器,请参阅以下文章:
若要开始学习如何使用 Azure 数据工厂复制数据,请参阅以下文章: