bcp_exec
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics 平台系统(PDW)
执行数据库表和用户文件之间数据的完整大容量复制。
语法
RETCODE bcp_exec (
HDBC hdbc,
LPDBINT pnRowsProcessed);
参数
hdbc
已启用大容量复制的 ODBC 连接句柄。
pnRowsProcessed
指向 DBINT 的指针。 bcp_exec函数用已成功复制的行数填充此 DBINT。 如果 pnRowsProcessed 为 NULL,则bcp_exec将忽略它。
返回
SUCCEED、SUCCEED_ASYNC 或 FAIL。 如果复制了所有行,bcp_exec函数将返回 SUCCEED。 如果异步大容量复制操作仍然未完成,bcp_exec将返回SUCCEED_ASYNC。 如果发生完全失败,或者生成错误的行数达到使用 bcp_control 为 BCPMAXERRS 指定的值,则bcp_exec返回 FAIL。 BCPMAXERRS 默认为 10。 BCPMAXERRS 选项只影响从数据文件读取行(并且不是已发送到服务器的行)时提供程序检测到的语法错误。 服务器在检测到某一行有错误时将中止批处理。 检查 pnRowsProcessed 参数,了解已成功复制的行数。
注解
此函数根据bcp_init中的 eDirection 参数的值,将数据从用户文件复制到数据库表,反之亦然。
在调用 bcp_exec之前,请使用有效的用户名调用 bcp_init 。 如果没有这样做,会导致错误。
bcp_exec是唯一可能在任何时间内未完成的大容量复制函数。 因此,它是支持异步模式的唯一大容量复制函数。 若要设置异步模式,请使用 SQLSetConnectAttr 在调用 bcp_exec之前将SQL_ATTR_ASYNC_ENABLE设置为SQL_ASYNC_ENABLE_ON。 若要测试完成,请使用相同的参数调用 bcp_exec 。 如果大容量复制尚未完成, bcp_exec 返回SUCCEED_ASYNC。 它还在 pnRowsProcessed 中返回已发送到服务器的行数的状态计数。 发送到服务器的行直到到达批的末尾时才会提交。
有关从 SQL Server 2005(9.x)开始的大容量复制中断性变更的信息,请参阅执行大容量复制操作(ODBC)。
示例
以下示例演示如何使用 bcp_exec:
// Variables like henv not specified.
HDBC 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("pubs..authors"), _T("authors.sav"), NULL, DB_OUT)
== FAIL)
{
// Raise error and return.
return;
}
// Now, execute the bulk copy.
if (bcp_exec(hdbc, &nRowsProcessed) == FAIL)
{
if (nRowsProcessed == -1)
{
printf_s("No rows processed on bulk copy execution.\n");
}
else
{
printf_s("Incomplete bulk copy. Only %ld row%s copied.\n",
nRowsProcessed, (nRowsProcessed == 1) ? "": "s");
}
return;
}
printf_s("%ld rows processed.\n", nRowsProcessed);
// Carry on.