在使用参数数组进行插入/更新期间,可以忽略一个/一些特定行的一个/一些参数。
我提供一个简单的例子。想象一下,我们有一个包含 3 列的表:X、Y 和 Z。我们希望在块中执行更新(如果缺少某些参数请忽略,与讨论无关):
#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 关键字相同。”
本机客户端可以做到这一点吗?在 Microsoft 文档中没有出现对 SQL_UNASSIGNED 的任何引用。
提前致谢。