使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据

本主题概述了如何使用 Transact-SQL BULK INSERT 语句和 INSERT...SELECT * FROM OPENROWSET(BULK...) 语句将数据文件中的数据大容量导入到 Microsoft SQL Server 表中。本主题还说明了使用 BULK INSERT 和 OPENROWSET(BULK...) 以及使用这些方法从远程数据源大容量导入数据的安全注意事项。

注意注意

在使用 BULK INSERT 或 OPENROWSET(BULK ) 时,请务必了解 SQL Server 2005 和更高版本是如何处理模拟的。有关详细信息,请参阅本主题后面的“安全注意事项”。

BULK INSERT 语句

BULK INSERT 将数据从数据文件加载到表中。此功能与 bcp 命令的 in 选项提供的功能相似,但是数据文件将由 SQL Server 进程读取。有关 BULK INSERT 语法的说明,请参阅 BULK INSERT (Transact-SQL)

示例

OPENROWSET(BULK ) 函数

通过调用 OPENROWSET 函数并指定 BULK 选项,访问 OPENROWSET 大容量行集提供程序。使用 OPENROWSET(BULK...) 函数可以通过 OLE DB 访问接口连接到远程数据源(如数据文件)以访问远程数据。

若要大容量导入数据,请从 INSERT 语句中的 SELECT...FROM 子句调用 OPENROWSET(BULK...)。大容量导入数据的基本语法如下:

INSERT ... SELECT * FROM OPENROWSET(BULK...)

在 INSERT 语句中使用时,OPENROWSET(BULK...) 支持表提示。BULK 子句除了接受 TABLOCK 等常规表提示之外,还可以接受下列专用表提示:IGNORE_CONSTRAINTS(仅忽略 CHECK 约束)、IGNORE_TRIGGERS、KEEPDEFAULTS 和 KEEPIDENTITY。有关详细信息,请参阅表提示 (Transact-SQL)

有关 BULK 选项的更多使用信息,请参阅 OPENROWSET (Transact-SQL)

示例

安全注意事项

如果用户使用的是 SQL Server 登录名,则系统将使用 SQL Server 进程帐户的安全配置文件。与此相反,如果 SQL Server 用户使用 Windows 身份验证登录,则该用户只能读取用户帐户可以访问的那些文件,而不考虑 SQL Server 进程的安全配置文件。

例如,假设用户使用 Windows 身份验证登录到某个 SQL Server 实例。对于能够使用 BULK INSERT 或 OPENROWSET 将数据从数据文件导入 SQL Server 表中的用户,用户帐户需要具有数据文件的读取权限。有了数据文件的访问权限,即使 SQL Server 进程没有访问该文件的权限,用户也可以将数据从文件导入表中。用户无需将文件访问权限授予 SQL Server 进程。

可以配置 SQL Server 和 Microsoft Windows,使得一个 SQL Server 实例可以通过转发已经过身份验证的 Windows 用户的凭据来连接到另一个 SQL Server 实例。这种安排称为“模拟”或“委托”。在使用 BULK INSERT 或 OPENROWSET 时,请务必了解 SQL Server 2005 和更高版本是如何处理用户模拟的安全性的。用户模拟允许数据文件保存在 SQL Server 进程或用户所在的计算机以外的另一台计算机上。例如,如果 Computer_A 上的用户具有对 Computer_B 上的数据文件的访问权限,而且凭据委托已设置妥当,则用户可以连接到运行在 Computer_C 上的 SQL Server 实例,访问 Computer_B 中的数据文件以及将数据从该文件大容量导入到 Computer_C 中的表中。有关详细信息,请参阅了解模拟

注意注意

SQL Server 2005 和更高版本的这种控制文件访问权限的方式避免了 Microsoft SQL Server 2000 和早期版本中出现过的安全问题。以前,用户经过身份验证后,对外部文件的访问权限是基于 SQL Server 进程的安全配置文件的。当 SQL Server 进程具有对某个文件的读权限时,只要用户是 bulkadmin 固定服务器角色的成员,即使没有对该文件的访问权限,该用户仍然可以使用 BULK INSERT 导入文件和访问文件内容。

从远程数据文件中大容量导入

若要使用 BULK INSERT 或 INSERT...SELECT * FROM OPENROWSET(BULK...) 从其他计算机中大容量导入数据,必须在两台计算机之间共享数据文件。指定共享数据文件时,请使用它的通用命名约定 (UNC) 名称,其一般形式为 **\\服务器名\共享名\路径\**文件名。此外,用来访问该数据文件的帐户必须具有读取远程磁盘上的文件所需的权限。

例如,下面的 BULK INSERT 语句会将名为 newdata.txt 的数据文件中的数据大容量导入到 AdventureWorks2008R2 数据库的 SalesOrderDetail 表。此数据文件驻留在系统 computer2 的 salesforce 网络共享目录下的 \dailyorders 共享文件夹中。

BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO
注意注意

此限制不会应用于 bcp 实用工具,因为文件由客户端独立于 SQL Server 进行读取。