问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/sql/relational-databases/import-export/import-data-from-excel-to-sql?view=sql-server-ver16

本文将介绍多种将Excel数据导入SQL Server或Azure SQL数据库的方法,包括使用SQL Server Management Studio、SQL Server Integration Services、OPENROWSET、BULK INSERT命令、bcp工具以及Azure数据工厂等。这些方法各有优劣,可以根据具体需求选择合适的方式。

将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. 选择“导入数据”或“导出数据”:

这将启动向导:

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

  • 启动SQL Server导入和导出向导
  • 导入和导出向导的简单示例入门

Integration Services (SSIS)

如果熟悉SQL Server Integration Services(SSIS),并且不想运行SQL Server导入和导出向导,可以创建在数据流中使用Excel源和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服务器配置选项(如以下示例所示),然后才能运行分布式查询。有关详细信息,请参阅服务器配置:即席分布式查询。

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.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 ...语法。

有关分布式查询的详细信息,请参阅以下文章:
1SQL Server仍支持分布式查询,但此功能的相关文档尚未更新。

链接服务器

还可以将从SQL Server到Excel文件的永久性连接配置为链接服务器。下面的示例将现有Excel链接服务器Data上的EXCELLINK工作表数据导入名为Data_ls的新SQL Server数据库表。

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

可以通过SQL Server Management Studio(SSMS)或运行系统存储过程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.JET.OLEDB.4.0';
SET @datasrc = 'C:\Temp\Data.xls';
SET @provstr = 'Excel 8.0';
EXEC @RC = [master].[dbo].[sp_addlinkedserver] @server,
    @srvproduct,
    @provider,
    @datasrc,
    @location,
    @provstr,
    @catalog;

有关链接服务器的详细信息,请参阅以下文章:

  • 创建链接服务器(SQL Server数据库引擎)
  • OPENQUERY (Transact-SQL)

有关链接服务器和分布式查询的更多示例和详细信息,请参阅以下文章:

  • 如何通过SQL Server链接服务器和分布式查询使用Excel

先决条件

要使用本页上的其他方法(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数据库的详细信息和示例,请参阅以下文章:

  • 使用BULK INSERT或OPENROWSET(BULK...)导入数据到SQL Server
  • BULK INSERT (Transact-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数据工厂复制数据,请参阅以下文章:

  • 使用复制活动移动数据
  • 教程:使用Azure门户创建带有复制活动的管道
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号