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

更新日期: 2006 年 7 月 17 日

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

ms175915.note(zh-cn,SQL.90).gif注意:
在使用 BULK INSERT 或 OPENROWSET(BULK...) 时,请务必了解 SQL Server 2005 是如何处理模拟的。有关详细信息,请参阅本主题后面的“安全注意事项”。

BULK INSERT 语句

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

示例

有关 BULK INSERT 示例,请参阅:

OPENROWSET(BULK...) 函数

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

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

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

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

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

示例

有关 INSERT...SELECT * FROM OPENROWSET(BULK...) 语句的示例,请参阅下列主题:

安全注意事项

如果用户使用的是 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 中的表中。有关详细信息,请参阅模拟概述

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

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

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

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

BULK INSERT AdventureWorks.Sales.SalesOrderDetail
   FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO
ms175915.note(zh-cn,SQL.90).gif注意:
此限制不会应用于 bcp 实用工具,因为文件由客户端独立于 SQL Server 进行读取。

请参阅

概念

导入和导出大容量数据
关于大容量导入和大容量导出操作
导入大容量数据的基本原则

其他资源

INSERT (Transact-SQL)
模拟概述
INSERT (Transact-SQL)
SELECT 子句 (Transact-SQL)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
FROM (Transact-SQL)
bcp 实用工具
BULK INSERT (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 7 月 17 日

更改的内容:
  • 将有关 bcp 实用工具的内容移到了新主题使用 bcp 实用工具导入和导出大容量数据
  • 修订了“OPENROWSET(BULK...) 函数”部分。
  • 插入了“安全注意事项”和“从远程数据文件中大容量导入”部分。
  • 向包含示例的概念性主题添加了“其他示例”链接。

2005 年 12 月 5 日

新增内容:
  • 添加了有关如何使用 Transact-SQL 命令从远程数据文件中导入数据的说明。