1

パラメーターの配列を使用して、挿入/更新中に 1 つまたはいくつかの特定の行の 1 つまたはいくつかのパラメーターを無視することができます。

簡単な例を示します。X、Y、Z の 3 つの列を持つ 1 つのテーブルがあるとします。ブロックで更新を実行したいとします (パラメータが欠落している場合は無視してください。議論には関係ありません)。

#define N_ROWS_PER_BLOCK 100
int h_x[N_ROWS_PER_BLOCK];
int h_y[N_ROWS_PER_BLOCK];
int h_z[N_ROWS_PER_BLOCK];

// Fill h_x, h_y and h_z with the values that we want - doesn't matter to this question
// (...)
strexec = "UPDATE table SET X = ?, Y = ?, Z = ?"

SQLBindParameter(stmt_handle, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, h_x, 0, NULL);
SQLBindParameter(stmt_handle, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, h_y, 0, NULL);
SQLBindParameter(stmt_handle, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, h_z, 0, NULL);

SQLSetStmtAttr(stmt_handle, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)N_ROWS_PER_BLOCK, 0);
SQLExecDirectA ( stmt_handle, (SQLCHAR*)strexec , SQL_NTS );

質問: ここで、何らかの理由で、行 #60 のパラメーター Xをステートメントの実行で無視する必要があるとします。これの利点は、「すべての列/属性」を含むステートメントを準備し、各行で必要な属性/列のみを更新できることです。

可能であれば、どうすればこれを行うことができますか?いくつかの(ダミーの)例を指摘できますか?

私はODBCのドキュメントを読み、SQL_ATTR_PARAM_OPERATION_PTR属性を使用してSQL_PARAM_PROCEEDまたはSQL_PARAM_IGNOREDを設定して(完全な)行(パラメーターのセット)を無視できることを知っていますが、行のすべての属性を無視したくありません。

編集:

これは、IBM ODBC ドキュメント (拡張インジケーター) で見つけました。

「ODBC アプリケーションは、拡張標識を使用して、変更を必要としない列の現在の値を指定せずに、UPDATE、INSERT、および MERGE ステートメントのすべての列を更新できます。

拡張標識を使用する場合、挿入する列の組み合わせごとに別個の INSERT ステートメントをコーディングする必要はありません。"

SQL_UNASSIGNED: "バインドされたパラメーターのターゲット列は、UPDATE および MERGE UPDATE 操作では無視されます。パラメーターは、INSERT および MERGE INSERT 操作の DEFAULT キーワードと同じ方法で処理されます。"

これは Native Client で可能ですか? Microsoft ドキュメントには、SQL_UNASSIGNED の参照はありません。

前もって感謝します。

4

1 に答える 1

0

2 つのステートメントを作成して準備できます。

strexec1 = "UPDATE table SET X = ?, Y = ?, Z = ?";
strexec2 = "UPDATE table SET Y = ?, Z = ?"

次に、バッチで実行するステートメントを選択するだけです

于 2013-01-17T11:20:48.770 に答える