执行批量复制操作

SQL Server 大容量复制功能支持将大量数据传入或传出 SQL Server 表或视图。 还可以通过指定 SELECT 语句来传输数据。 可以在 SQL Server 和作系统数据文件(如 ASCII 文件)之间移动数据。 数据文件可以具有不同的格式;该格式定义为在格式化文件中批量复制。 或者,可以将数据加载到程序变量中,并使用大容量复制函数和方法传输到 SQL Server。

有关演示此功能的示例应用程序,请参阅 使用 IRowsetFastLoad (OLE DB)批量复制数据

应用程序通常通过以下方式之一使用大容量复制:

  • 将数据以与表或视图相同的格式存储在数据文件中,从表、视图或 Transact-SQL 语句的结果集大容量复制。

    这称为本机模式数据文件。

  • 从表、视图或 Transact-SQL 语句的结果集批量复制到数据文件中,其中数据存储的格式不是表或视图之一。

    在这种情况下,将创建一个单独的格式化文件,用于定义每个列的特征(数据类型、位置、长度、终止符等),因为它存储在数据文件中。 如果所有列都转换为字符格式,则生成的文件称为字符模式数据文件。

  • 从数据文件大容量复制到表或视图中。

    如果需要,将使用格式化文件来确定数据文件的布局。

  • 将数据加载到程序变量中,然后使用大容量复制函数将数据导入表或视图,以便一次在一行中批量复制。

大容量复制函数使用的数据文件不必由另一个大容量复制程序创建。 任何其他系统都可以根据大容量复制定义生成数据文件和格式化文件;然后,可以将这些文件与 SQL Server 大容量复制程序一起使用,将数据导入 SQL Server。 例如,可以从以制表符分隔的文件中的电子表格导出数据,生成描述制表符分隔文件的格式化文件,然后使用大容量复制程序将数据快速导入 SQL Server。 大容量复制生成的数据文件也可以导入到其他应用程序中。 例如,可以使用大容量复制函数将数据从表或视图导出到选项卡分隔的文件中,然后加载到电子表格中。

编写应用程序编码以使用大容量复制函数的程序员应遵循常规规则,实现良好的大容量复制性能。 有关支持 SQL Server 中的大容量复制作的详细信息,请参阅大容量导入和导出数据(SQL Server)。

局限性与限制

CLR 用户定义的类型(UDT)必须绑定为二进制数据。 即使格式化文件将 SQLCHAR 指定为目标 UDT 列的数据类型,BCP 实用工具也会将数据视为二进制数据。

不要对大容量复制作使用 SET FMTONLY OFF。 SET FMTONLY OFF 可能会导致大容量复制作失败或产生意外结果。

SQL Server Native Client OLE DB 访问接口

SQL Server Native Client OLE DB 访问接口实现两种方法,用于使用 SQL Server 数据库执行大容量复制作。 第一种方法涉及使用 IRowsetFastLoad 接口执行基于内存的大容量复制作;第二个涉及使用 IBCPSession 接口执行基于文件的大容量复制作。

使用基于内存的大容量复制作

SQL Server Native Client OLE DB 提供程序实现 IRowsetFastLoad 接口,以公开对基于 SQL Server 内存的大容量复制作的支持。 IRowsetFastLoad 接口实现 IRowsetFastLoad::CommitIRowsetFastLoad::InsertRow 方法。

为 IRowsetFastLoad 启用会话

使用者将 SQL Server Native Client OLE DB 提供程序设置为 SSPROP_ENABLEFASTLOAD VARIANT_TRUE,通知 SQL Server Native Client OLE DB 访问接口需要批量复制。 在数据源上设置属性后,使用者将创建 SQL Server Native Client OLE DB 访问接口会话。 新会话允许使用者访问 IRowsetFastLoad 接口。

注释

如果 IDataInitialize 接口用于初始化数据源,则必须在 IOpenRowset::OpenRowset 方法的 rgPropertySets 参数中设置 SSPROP_IRowsetFastLoad 属性;否则,对 OpenRowset 方法的调用将返回E_NOINTERFACE。

为大容量复制启用会话会限制对会话上的接口的 SQL Server Native Client OLE DB 提供程序支持。 启用大容量复制的会话仅公开以下接口:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

若要禁用创建启用了大容量复制的行集,并导致 SQL Server Native Client OLE DB 访问接口会话还原为标准处理,请将SSPROP_ENABLEFASTLOAD重置为VARIANT_FALSE。

IRowsetFastLoad Rowsets

SQL Server Native Client OLE DB 访问接口大容量复制行集是只读的,但它们公开了允许使用者确定 SQL Server 表结构的接口。 在启用了大容量复制的 SQL Server Native Client OLE DB 访问接口行集中公开以下接口:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

特定于提供程序的属性SSPROP_FASTLOADOPTIONS、SSPROP_FASTLOADKEEPNULLS和SSPROP_FASTLOADKEEPIDENTITY SQL Server Native Client OLE DB 访问接口大容量复制行集的行为。 这些属性在 rgPropertySetsIOpenRowset参数成员的 rgProperties 成员中指定。

属性 ID DESCRIPTION
SSPROP_FASTLOADKEEPIDENTITY 列:否

R/W:读/写

类型:VT_BOOL

默认值:VARIANT_FALSE

说明:维护使用者提供的标识值。

VARIANT_FALSE:SQL Server 表中标识列的值由 SQL Server 生成。 SQL Server Native Client OLE DB 访问接口忽略为该列绑定的任何值。

VARIANT_TRUE:使用者绑定提供 SQL Server 标识列值的访问器。 标识属性在接受 NULL 的列上不可用,因此使用者在每个 IRowsetFastLoad::Insert 调用上提供唯一值。
SSPROP_FASTLOADKEEPNULLS 列:否

R/W:读/写

类型:VT_BOOL

默认值:VARIANT_FALSE

说明:为具有 DEFAULT 约束的列维护 NULL。 仅影响接受 NULL 且应用 DEFAULT 约束的 SQL Server 列。

VARIANT_FALSE:当 SQL Server Native Client OLE DB 访问接口使用者插入包含列 NULL 的行时,SQL Server 将插入该列的默认值。

VARIANT_TRUE:当 SQL Server Native Client OLE DB 访问接口使用者插入包含列 NULL 的行时,SQL Server 将为列值插入 NULL。
SSPROP_FASTLOADOPTIONS 列:否

R/W:读/写

类型:VT_BSTR

默认值:无

说明:此属性与 -hhint[,...”n]” bcp 实用工具的选项。 在将数据大容量复制到表中时,可以将以下字符串用作选项(s)。

ORDERcolumn[ASC DESC | ][,...n]: 数据文件中的数据排序顺序。 如果加载的数据文件根据表上的聚集索引进行排序,则大容量复制性能会得到改善。

= ROWS_PER_BATCHbb:每个批次的数据行数(如 bb)。 服务器根据 bb值优化大容量加载。 默认情况下, ROWS_PER_BATCH 未知。

KILOBYTES_PER_BATCH = cc:每批数据(以抄送形式)的千字节数(KB)。 默认情况下, KILOBYTES_PER_BATCH 未知。

TABLOCK:在大容量复制作期间获取表级锁。 此选项可显著提高性能,因为仅在大容量复制作期间保留锁可减少对表的锁争用。 如果表没有索引且指定 TABLOCK ,则多个客户端可以同时加载表。 默认情况下,锁定行为由 大容量加载时表选项表锁确定。

CHECK_CONSTRAINTS:在大容量复制作期间检查 对table_name 的任何约束。 默认情况下,将忽略约束。

FIRE_TRIGGER:SQL Server 对触发器使用行版本控制,并将行版本存储在 tempdb 的版本存储中。 因此,即使启用了触发器,批量日志记录优化也可用。 在批量导入启用了触发器的大量行的批处理之前,可能需要扩展 tempdb 的大小。

使用基于文件的大容量复制作

SQL Server Native Client OLE DB 提供程序实现 IBCPSession 接口,以公开对基于 SQL Server 文件的大容量复制作的支持。 IBCPSession 接口实现 IBCPSession::BCPColFmtIBCPSession::BCPColumnsIBCPSession::BCPControlIBCPSession::BCPDoneIBCPSession::BCPExecIBCPSession::BCPInitIBCPSession::BCPReadFmtIBCPSession::BCPWriteFmt方法。

SQL Server Native Client ODBC 驱动程序

SQL Server Native Client ODBC 驱动程序维护对属于 SQL Server ODBC 驱动程序早期版本的大容量复制作的相同支持。 有关使用 SQL Server Native Client ODBC 驱动程序执行大容量复制作的信息,请参阅执行大容量复制作(ODBC)。

另请参阅

SQL Server Native Client 功能
数据源属性 (OLE DB)
大容量导入和导出数据 (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
优化大容量导入性能