将 Excel 数据导入 SQL Server 或 Azure SQL 数据库

适用于:SQL ServerAzure SQL 数据库

有多种方法可用于将 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) 包。

  1. 在 SQL Server Management Studio 中,连接到 SQL Server 数据库引擎 的实例。

  2. 展开“数据库”

  3. 右键单击某个数据库。

  4. 选择“任务”

  5. 选择“导入数据”或“导出数据”

    启动向导 SSMS 的屏幕截图。

这将启动向导:

“连接到 Excel 数据源”的屏幕截图。

有关详细信息,请参阅下列文章:

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 OPENROWSETOPENDATASOURCE 函数直接将数据从 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 INSERTOPENROWSET。 有关示例,请参阅使用 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 数据工厂复制数据,请参阅以下文章: