bcp_control
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics 平台系统(PDW)
更改文件与 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_writefmt后bcp_control(hdbc,
调用 bcp_control(hdbc,
BCPDELAYREADFMT, (void *)FALSE)
, (void *)TRUE)
,也会发生序列错误。
有关详细信息,请参阅元数据发现。
BCPFILECP
iValue 包含数据文件的代码页数。 可以指定代码页的标号,例如 1252 或 850,或者采用以下值之一:
BCPFILE_ACP:文件中的数据位于客户端的 Microsoft Windows 代码页中。
BCPFILE_OEMCP:文件中的数据位于客户端的 OEM 代码页中(默认值)。
BCPFILE_RAW:文件中的数据位于 SQL Server 的代码页中。
BCPFILEFMT
数据文件格式的版本号。 这可以是 80 (SQL Server 2000 (8.x)、90 (SQL Server 2005 (9.x)、100 (SQL Server 2008 (10.0.x) 或 SQL Server 2008 R2 (10.50.x)、110 (SQL Server 2012 (11.x)或 120 (SQL Server 2014 (12.x))。 120 是默认值。 对于采用服务器早期版本所支持的格式的数据,该选项对导出和导入这样的数据非常有用。 例如,若要将从 SQL Server 2000 (8.x) 服务器 中的文本列获取的数据导入 SQL Server 2005 (9.x) 或更高版本服务器中的 varchar(max) 列,应指定 80。 同样,如果在从 varchar(max) 列导出数据时指定了 80,则它将像将文本列一样保存在 SQL Server 2000 (8.x) 格式中,并且可以导入到 SQL Server 2000 (8.x) 服务器的文本列中。
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 选项仅适用于DB_OUT。
如果为 FALSE, 表示 1997 年 1 月 1 日的日期/时间 值将转换为字符串:1997-01-01 00:00:00.000。 如果为 TRUE,则表示 相同的日期/时间 值:{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。
注解
此函数设置用于大容量复制操作的各种控制参数,其中包括取消大容量复制之前允许的错误数、要从数据文件中复制的第一批和最后一批的行数和批大小。
此函数还用于在从 SQL Server 大容量复制 SELECT 的结果集时指定 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);