使用 BULK INSERT 或 OPENROWSET(BULK...) 导入批量数据 (SQL Server)
2016-09-24 17:01
676 查看
本主题适用于:
SQL Server(从 2016 开始)
Azure
SQL 数据库
Azure SQL 数据仓库
并行数据仓库
本主题概述了如何使用 Transact-SQL BULK INSERT 语句和 INSERT...SELECT * FROM OPENROWSET(BULK...) 语句将数据从某一数据文件大容量导入到 SQL Server 表中。 本主题还说明了使用 BULK INSERT 和 OPENROWSET(BULK...) 以及使用这些方法从远程数据源大容量导入数据的安全注意事项。
BULK
INSERT 语句
BULK INSERT 将数据从数据文件加载到表中。 此功能与 bcp 命令的 in 选项提供的功能相似,但是数据文件将由 SQL Server 进程读取。 有关 BULK INSERT 语法的说明,请参阅 BULK
INSERT (Transact-SQL)。
有关 BULK INSERT 示例,请参阅:
BULK INSERT (Transact-SQL)
批量导入和导出 XML 文档的示例 (SQL Server)
批量导入数据时保留标识值 (SQL Server)
在批量导入期间保留 Null 或使用默认值 (SQL Server)
指定字段终止符和行终止符 (SQL Server)
使用格式化文件批量导入数据 (SQL Server)
使用字符格式导入或导出数据 (SQL Server)
使用本机格式导入或导出数据 (SQL Server)
使用 Unicode 字符格式导入或导出数据 (SQL Server)
使用 Unicode 本机格式导入或导出数据 (SQL Server)
使用格式化文件跳过表列 (SQL Server)
使用格式化文件将表列映射到数据文件字段 (SQL Server)
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)。
有关 INSERT...SELECT * FROM OPENROWSET(BULK...) 语句的示例,请参阅下列主题:
批量导入和导出 XML 文档的示例 (SQL Server)
批量导入数据时保留标识值 (SQL Server)
在批量导入期间保留 Null 或使用默认值 (SQL Server)
使用格式化文件批量导入数据 (SQL Server)
使用字符格式导入或导出数据 (SQL Server)
使用格式化文件跳过表列 (SQL Server)
使用格式化文件跳过数据字段 (SQL Server)
使用格式化文件将表列映射到数据文件字段 (SQL Server)
需要考虑的安全性因素
如果用户使用的是 SQL Server 登录名,则系统将使用 SQL Server 进程帐户的安全配置文件。 使用 SQL Server 身份验证的登录名不能在数据库引擎外部进行身份验证。 因此,当 BULK INSERT 命令由使用 SQL Server 身份验证的登录名启动时,使用 SQL Server 进程帐户(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 版本是如何处理用户模拟的安全性的。 用户模拟允许数据文件保存在 SQL Server 进程或用户所在的计算机以外的另一台计算机上。 例如,如果 Computer_A 上的用户具有对Computer_B 上的数据文件的访问权限,而且凭据委托已设置妥当,则用户可以连接到运行在 Computer_C 上的
SQL Server 实例,访问Computer_B 中的数据文件以及将数据从该文件大容量导入到 Computer_C 中的表中。
从远程数据文件中大容量导入
若要使用 BULK INSERT 或 INSERT...SELECT * FROM OPENROWSET(BULK...) 从其他计算机中大容量导入数据,必须在两台计算机之间共享数据文件。 指定共享数据文件时,请使用它的通用命名约定 (UNC) 名称,其一般形式为 \\服务器名\共享名\路径\文件名。 此外,用来访问该数据文件的帐户必须具有读取远程磁盘上的文件所需的权限。
例如,下面的
此数据文件驻留在系统
另请参阅
INSERT (Transact-SQL)
SELECT 子句 (Transact-SQL)
批量导入和导出数据 (SQL Server)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
FROM (Transact-SQL)
bcp 实用工具
BULK INSERT (Transact-SQL)
SQL Server(从 2016 开始)
Azure
SQL 数据库
Azure SQL 数据仓库
并行数据仓库
本主题概述了如何使用 Transact-SQL BULK INSERT 语句和 INSERT...SELECT * FROM OPENROWSET(BULK...) 语句将数据从某一数据文件大容量导入到 SQL Server 表中。 本主题还说明了使用 BULK INSERT 和 OPENROWSET(BULK...) 以及使用这些方法从远程数据源大容量导入数据的安全注意事项。
说明 |
---|
在使用 BULK INSERT 或 OPENROWSET(BULK ) 时,请务必了解 SQL Server 版本是如何处理模拟的。 有关详细信息,请参阅本主题后面的“安全注意事项”。 |
INSERT 语句
BULK INSERT 将数据从数据文件加载到表中。 此功能与 bcp 命令的 in 选项提供的功能相似,但是数据文件将由 SQL Server 进程读取。 有关 BULK INSERT 语法的说明,请参阅 BULK
INSERT (Transact-SQL)。
示例
有关 BULK INSERT 示例,请参阅:BULK INSERT (Transact-SQL)
批量导入和导出 XML 文档的示例 (SQL Server)
批量导入数据时保留标识值 (SQL Server)
在批量导入期间保留 Null 或使用默认值 (SQL Server)
指定字段终止符和行终止符 (SQL Server)
使用格式化文件批量导入数据 (SQL Server)
使用字符格式导入或导出数据 (SQL Server)
使用本机格式导入或导出数据 (SQL Server)
使用 Unicode 字符格式导入或导出数据 (SQL Server)
使用 Unicode 本机格式导入或导出数据 (SQL Server)
使用格式化文件跳过表列 (SQL Server)
使用格式化文件将表列映射到数据文件字段 (SQL Server)
) 函数
通过调用 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)。
示例
有关 INSERT...SELECT * FROM OPENROWSET(BULK...) 语句的示例,请参阅下列主题:批量导入和导出 XML 文档的示例 (SQL Server)
批量导入数据时保留标识值 (SQL Server)
在批量导入期间保留 Null 或使用默认值 (SQL Server)
使用格式化文件批量导入数据 (SQL Server)
使用字符格式导入或导出数据 (SQL Server)
使用格式化文件跳过表列 (SQL Server)
使用格式化文件跳过数据字段 (SQL Server)
使用格式化文件将表列映射到数据文件字段 (SQL Server)
如果用户使用的是 SQL Server 登录名,则系统将使用 SQL Server 进程帐户的安全配置文件。 使用 SQL Server 身份验证的登录名不能在数据库引擎外部进行身份验证。 因此,当 BULK INSERT 命令由使用 SQL Server 身份验证的登录名启动时,使用 SQL Server 进程帐户(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 版本是如何处理用户模拟的安全性的。 用户模拟允许数据文件保存在 SQL Server 进程或用户所在的计算机以外的另一台计算机上。 例如,如果 Computer_A 上的用户具有对Computer_B 上的数据文件的访问权限,而且凭据委托已设置妥当,则用户可以连接到运行在 Computer_C 上的
SQL Server 实例,访问Computer_B 中的数据文件以及将数据从该文件大容量导入到 Computer_C 中的表中。
若要使用 BULK INSERT 或 INSERT...SELECT * FROM OPENROWSET(BULK...) 从其他计算机中大容量导入数据,必须在两台计算机之间共享数据文件。 指定共享数据文件时,请使用它的通用命名约定 (UNC) 名称,其一般形式为 \\服务器名\共享名\路径\文件名。 此外,用来访问该数据文件的帐户必须具有读取远程磁盘上的文件所需的权限。
例如,下面的
BULK INSERT语句会将名为
SalesOrderDetail的数据文件中的数据大容量导入到
AdventureWorks数据库的
newdata.txt表。
此数据文件驻留在系统
\dailyorders的
salesforce网络共享目录下的
computer2共享文件夹中。
BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail FROM '\\computer2\salesforce\dailyorders\neworders.txt'; GO
说明 |
---|
此限制不适用于 bcp 实用工具,因为客户端独立于 SQL Server 读取文件。 |
INSERT (Transact-SQL)
SELECT 子句 (Transact-SQL)
批量导入和导出数据 (SQL Server)
OPENROWSET (Transact-SQL)
SELECT (Transact-SQL)
FROM (Transact-SQL)
bcp 实用工具
BULK INSERT (Transact-SQL)
相关文章推荐
- 使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据
- SQL Server使用Bulk Insert把一个文本导入到数据库
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL SERVER 导入、导出数据到Exce(使用OpenRowset,、OpenDataSource函数)以及访问远程数据库(openrowset/opendatasource/openquery)
- (总结) SQL Server Bulk Insert 批量数据导入
- BULK INSERT如何将大量数据高效地导入SQL Server
- BULK INSERT如何将大量数据高效地导入SQL Server
- C# 使用MySqlBulkLoader 批量导入数据到Mysql
- Hbase 批量数据BulkLoad 导入使用
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- 使用SqlBulkCopy将datatable数据批量导入sqlServer
- SQL Server中采用BULK INSERT实现大数据量文本文件批量导入
- 使用“bulk insert ”进行批量插入数据
- BULK INSERT如何将大量数据高效地导入SQL Server
- BULK INSERT 批量导入SQL Server
- (总结) SQL Server Bulk Insert 批量数据导入
- SQL Server使用Bulk Insert把一个文本导入到数据库--http://www.wangchao.net.cn/it/detail_59013.html
- 使用OPENROWSET将数据从excel导入到sql server