使用参数数组插入/更新时,可以忽略一个/某些特定行的一个/一些参数。
我提供了一个简单的例子。想象一下,我们有一个包含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文档(扩展指标)中找到了这个:
“ODBC应用程序可以使用扩展指示符来更新UPDATE,INSERT和MERGE语句中的所有列,而无需指定不需要更改的列的当前值。
如果使用扩展指示符,则不需要为要插入的每个列组合编写单独的INSERT语句“
SQL_UNASSIGNED:“对于UPDATE和MERGE UPDATE操作,将忽略bound参数的目标列。该参数的处理方式与INSERT和MERGE INSERT操作的DEFAULT关键字相同。”
Native Client可以实现吗?在Microsoft文档中没有出现任何SQL_UNASSIGNED的引用。
提前致谢。
答案 0 :(得分:0)
您可以创建和准备2个语句:
strexec1 = "UPDATE table SET X = ?, Y = ?, Z = ?";
strexec2 = "UPDATE table SET Y = ?, Z = ?"
然后只选择应该在批处理中执行的语句