bcp_exec
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (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_exec は、完全なエラーが発生した場合、またはエラーを生成する行の数が、 bcp_controlを使用して BCPMAXERRS に指定された値に達した場合に 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.