bcp_control
更改文件和SQL Server之间大容量复制的各种控件参数的默认设置。
语法
RETCODE bcp_control (
HDBC
hdbc
,
INT
eOption
,
void*
iValue
);
参数
hdbc
启用大容量复制的 ODBC 连接句柄。
eOption
可以是下列值之一:
BCPABORT
停止正在进行的大容量复制操作。 从另一个线程调用具有 BCPABORT eOption 的bcp_control,以停止正在运行的大容量复制操作。 忽略 iValue 参数。
BCPBATCH
每批的行数。 默认值为 0,表示在提取数据时表中的所有行,或者在将数据复制到SQL Server时,用户数据文件中的所有行。 值小于 1 则将 BCPBATCH 重置为默认值。
BCPDELAYREADFMT
布尔值(如果设置为 true)将导致 在执行时读取bcp_readfmt 。 如果为 false (默认) ,bcp_readfmt将立即读取格式化文件。 如果 BCPDELAYREADFMT 为 true 并且调用 bcp_columns 或 bcp_setcolfmt,则会发生序列错误。
如果在调用 BCPDELAYREADFMT 后bcp_control(hdbc,
调用 bcp_control(hdbc,
BCPDELAYREADFMT, (void *)FALSE)
, (void *)TRUE)
并bcp_writefmt,也会出现序列错误。
有关详细信息,请参阅元数据发现。
BCPFILECP
iValue 包含数据文件的代码页号。 可以指定代码页的标号,例如 1252 或 850,或者采用以下值之一:
BCPFILE_ACP:文件中的数据位于 Microsoft Windows 中?? 客户端的代码页。
BCPFILE_OEMCP:文件中的数据位于客户端的 OEM 代码页中(默认值)。
BCPFILE_RAW:文件中的数据位于SQL Server的代码页中。
BCPFILEFMT
数据文件格式的版本号。 这可以是 80 (SQL Server 2000) 、90 (SQL Server 2005) 、100 (SQL Server 2008 或 SQL Server 2008 R2) 、110 (SQL Server 2012) 或 120 (SQL Server 2014) 。 120 是默认值。 对于采用服务器早期版本所支持的格式的数据,该选项对导出和导入这样的数据非常有用。 例如,若要从 SQL Server 2000 服务器中的文本列获取的数据导入到 SQL Server 2005 或更高版本服务器的 varchar (max) 列,应指定 80。 同样,如果在从 varchar (max) 列导出数据时指定 80,则会像以 SQL Server 2000 格式保存文本列一样保存数据,并且可以导入到 SQL Server 2000 服务器的文本列中。
BCPFIRST
要复制的文件或表的第一行数据。 默认值为 1;值小于 1 则将此选项重置为其默认值。
BCPFIRSTEX
对于 BCP out 操作,指定要复制到数据文件的数据库表的第一行。
对于 BCP in 操作,指定要复制到数据库表的数据文件的第一行。
iValue 参数应为包含值的有符号 64 位整数的地址。 可以传递给 BCPFIRSTEX 的最大值为 2^63-1。
BCPFMTXML
指定生成的格式化文件应采用 XML 格式。 默认情况下将禁用此选项。
XML 格式化文件提供了更大的灵活性,但增加了一些约束。 例如,不能同时指定字段的前缀和终止符,这在较旧的格式文件中是可能的。
注意
仅当SQL Server随SQL Server Native Client一起安装时,才支持 XML 格式化文件。
BCPHINTS
iValue 包含 SQLTCHAR 字符串指针。 寻址的字符串指定 SQL Server 大容量复制处理提示或返回结果集的 Transact-SQL 语句。 如果指定的 Transact-SQL 语句返回多个结果集,则忽略第一个结果集之后的所有结果集。 有关大容量复制处理提示的详细信息,请参阅 bcp 实用工具。
BCPKEEPIDENTITY
当 iValue 为 TRUE 时,指定大容量复制函数插入为使用标识约束定义的SQL Server列提供的数据值。 输入文件必须提供标识列的值。 如果未进行设置,则为插入的行生成新标识值。 忽略文件的标识列中所存在的任何数据。
BCPKEEPNULLS
指定是否会将文件中的空数据值转换为 SQL Server 表中的 NULL 值。 当 iValue 为 TRUE 时,空值将在SQL Server表中转换为 NULL。 默认情况下会将空值转换为 SQL Server 表中的列的默认值(如果存在默认值)。
BCPLAST
要复制的最后一行。 默认值为复制所有行;值小于 1 则将此选项重置为其默认值。
BCPLASTEX
对于 BCP out 操作,指定要复制到数据文件的数据库表的最后一行。
对于 BCP in 操作,指定要复制到数据库表的数据文件的最后一行。
iValue 参数应为包含值的有符号 64 位整数的地址。 可以传递到 BCPLASTEX 的最大值为 2^63-1。
BCPMAXERRS
大容量复制操作失败之前允许的错误数。 默认值为 10;小于 1 的值会将此选项重置为其默认值。 大容量复制将最大错误数限制为 65,535 个。 如果尝试将该选项设置为大于 65,535 的值,将导致该选项设置为 65,535。
BCPODBC
如果为 TRUE,则指定以字符格式保存的 datetime 和 smalldatetime 值将使用 ODBC 时间戳转义序列前缀和后缀。 BCPODBC 选项仅适用于 BCP_OUT。
如果为 FALSE,则表示 1997 年 1 月 1 日的 日期/时间 值将转换为字符串:1997-01-01 00:00:00.000。 如果为 TRUE,则表示相同的 datetime 值:{ts '1997-01-01 00:00:00.000'}。
BCPROWCOUNT
返回当前(或上一次)BCP 操作所影响的行数。
BCPTEXTFILE
如果为 TRUE,则指定数据文件为文本文件,而非二进制文件。 如果该文件为文本文件,BCP 将通过检查数据文件的前两个字节中的 Unicode 字节标记来确定该文件是否是 Unicode 文件。
BCPUNICODEFILE
如果为 TRUE,则指定输入文件是 Unicode 文件。
iValue
指定的 eOption 的值。 iValue 是一个整数 (LONGLONG) 值强制转换为 void 指针,以便将来扩展到 64 位值。
返回
SUCCEED 或 FAIL。
备注
此函数设置用于大容量复制操作的各种控制参数,其中包括取消大容量复制之前允许的错误数、要从数据文件中复制的第一批和最后一批的行数和批大小。
从 SELECT 的结果集大容量复制SQL Server时,此函数还用于指定 SELECT 语句。 将 eOption 设置为 BCPHINTS,并将 iValue 设置为具有指向包含 SELECT 语句的 SQLTCHAR 字符串的指针。
只有在用户文件和SQL Server表之间复制时,这些控制参数才有意义。 控制参数设置对复制到具有bcp_sendrow SQL Server的行没有影响。
示例
// Variables like henv not specified.
SQLHDBC hdbc;
DBINT nRowsProcessed;
// Application initiation, get an ODBC environment handle, allocate the
// hdbc, and so on.
...
// Enable bulk copy prior to connecting on allocated hdbc.
SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP, (SQLPOINTER) SQL_BCP_ON,
SQL_IS_INTEGER);
// Connect to the data source, return on error.
if (!SQL_SUCCEEDED(SQLConnect(hdbc, _T("myDSN"), SQL_NTS,
_T("myUser"), SQL_NTS, _T("myPwd"), SQL_NTS)))
{
// Raise error and return.
return;
}
// Initialize bulk copy.
if (bcp_init(hdbc, _T("address"), _T("address.add"), _T("addr.err"),
DB_IN) == FAIL)
{
// Raise error and return.
return;
}
// Set the number of rows per batch.
if (bcp_control(hdbc, BCPBATCH, (void*) 1000) == FAIL)
{
// Raise error and return.
return;
}
// Set file column count.
if (bcp_columns(hdbc, 1) == FAIL)
{
// Raise error and return.
return;
}
// Set the file format.
if (bcp_colfmt(hdbc, 1, 0, 0, SQL_VARLEN_DATA, '\n', 1, 1)
== FAIL)
{
// Raise error and return.
return;
}
// Execute the bulk copy.
if (bcp_exec(hdbc, &nRowsProcessed) == FAIL)
{
// Raise error and return.
return;
}
printf_s("%ld rows processed by bulk copy.", nRowsProcessed);