使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据
更新日期: 2006 年 7 月 17 日
本主题概要介绍了如何使用 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)。
示例
有关 BULK INSERT 示例,请参阅:
- BULK INSERT (Transact-SQL)
- 大容量导入和导出 XML 文档的示例
- 在不同排序规则间复制数据
- 大容量导入数据时保留标识值
- 在大容量导入期间保留空值或使用默认值
- 指定字段终止符和行终止符
- 使用格式化文件大容量导入数据
- 使用字符格式导入或导出数据
- 使用本机格式导入或导出数据
- 使用 Unicode 字符格式导入或导出数据
- 使用 Unicode 本机格式导入或导出数据
- 使用格式化文件跳过表列
- 使用格式化文件将表列映射到数据文件字段
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...) 语句的示例,请参阅下列主题:
- 大容量导入和导出 XML 文档的示例
- 大容量导入数据时保留标识值
- 在大容量导入期间保留空值或使用默认值
- 使用格式化文件大容量导入数据
- 使用字符格式导入或导出数据
- 使用格式化文件跳过表列
- 使用格式化文件跳过数据字段
- 使用格式化文件将表列映射到数据文件字段
安全注意事项
如果用户使用的是 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) 名称,其一般形式为 **\\服务器名\共享名\路径\**文件名。必须向 SQL Server 使用的用户帐户授予读取远程磁盘上的文件所需的权限。
例如,下面的 BULK INSERT
语句会将名为 newdata.txt
的数据文件中的数据大容量导入到 AdventureWorks
数据库的 SalesOrderDetail
表。此数据文件驻留在系统 computer2
的 salesforce
网络共享目录下的 \dailyorders
共享文件夹中。
BULK INSERT AdventureWorks.Sales.SalesOrderDetail
FROM '\\computer2\salesforce\dailyorders\neworders.txt';
GO
注意: |
---|
此限制不会应用于 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)
帮助和信息
更改历史记录
发布日期 | 历史记录 |
---|---|
2006 年 7 月 17 日 |
|
2005 年 12 月 5 日 |
|