パラメーターの配列を使用して、挿入/更新中に 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 ドキュメント (拡張インジケーター) で見つけました。
- http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.odbc%2Fsrc%2Ftpc%2Fdb2z_afarinp.htm
- http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.odbc%2Fsrc%2Ftpc%2Fdb2z_fnbindparameter.htm
「ODBC アプリケーションは、拡張標識を使用して、変更を必要としない列の現在の値を指定せずに、UPDATE、INSERT、および MERGE ステートメントのすべての列を更新できます。
拡張標識を使用する場合、挿入する列の組み合わせごとに別個の INSERT ステートメントをコーディングする必要はありません。"
SQL_UNASSIGNED: "バインドされたパラメーターのターゲット列は、UPDATE および MERGE UPDATE 操作では無視されます。パラメーターは、INSERT および MERGE INSERT 操作の DEFAULT キーワードと同じ方法で処理されます。"
これは Native Client で可能ですか? Microsoft ドキュメントには、SQL_UNASSIGNED の参照はありません。
前もって感謝します。