ODBC:参数数组 - 忽略参数

时间:2013-01-17 11:16:24

标签: c++ c sql-server sql-server-2008 odbc

使用参数数组插入/更新时,可以忽略一个/某些特定行的一个/一些参数。

我提供了一个简单的例子。想象一下,我们有一个包含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的引用。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以创建和准备2个语句:

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

然后只选择应该在批处理中执行的语句