按名称绑定参数(命名参数)

某些 DBMS 允许应用程序按名称指定存储过程的参数,而不是按过程调用中的位置指定这些参数。 此类参数称为命名参数。 ODBC 支持使用命名参数。 在 ODBC 中,命名参数仅用于对存储过程的调用,而不能用于其他 SQL 语句。

驱动程序检查 IPD 的 SQL_DESC_UNNAMED 字段的值,以确定是否使用命名参数。 如果 SQL_DESC_UNNAMED 未设置为 SQL_UNNAMED,驱动程序将使用 IPD 的 SQL_DESC_NAME 字段中的名称来标识该参数。 若要绑定该参数,应用程序可以调用 SQLBindParameter 来指定参数信息,然后可以调用 SQLSetDescField 来设置 IPD 的 SQL_DESC_NAME 字段。 使用命名参数时,参数在过程调用中的顺序并不重要,并且该参数的记录编号将被忽略。

未命名参数和命名参数之间的区别在于描述符的记录编号与过程中的参数编号之间的关系。 使用未命名参数时,第一个参数标记与参数描述符中的第一条记录相关,而参数描述符又与过程调用中的第一个参数(按创建顺序排列)相关。 使用命名参数时,第一个参数标记仍与参数描述符的第一条记录相关,但描述符的记录编号与过程中的参数编号之间的关系不再存在。 命名参数不使用描述符的记录编号到过程参数位置的映射;相反,描述符记录名称映射到过程参数名称。

注意

如果启用了 IPD 的自动填充,驱动程序将填充描述符,以便描述符记录的顺序与过程定义中参数的顺序相一致,即便使用命名参数也是如此。

如果使用命名参数,则所有参数都必须是命名参数。 如有任何参数不是命名参数,则所有参数都不是命名参数。 如果既有命名参数又有未命名参数,则行为将依赖于驱动程序。

作为命名参数的示例,假设已按如下所示定义了 SQL Server 存储过程:

CREATE PROCEDURE test @title_id int = 1, @quote char(30) AS <blah>  

在此过程中,第一个参数 @title_id 的默认值为 1。 应用程序可以使用以下代码调用此过程,以便其仅指定一个动态参数。 此参数是名为“@quote”的命名参数。

// Prepare the procedure invocation statement.  
SQLPrepare(hstmt, "{call test(?)}", SQL_NTS);  
  
// Populate record 1 of ipd.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,  
                  30, 0, szQuote, 0, &cbValue);  
  
// Get ipd handle and set the SQL_DESC_NAMED and SQL_DESC_UNNAMED fields  
// for record #1.  
SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_DESC, &hIpd, 0, 0);  
SQLSetDescField(hIpd, 1, SQL_DESC_NAME, "@quote", SQL_NTS);  
  
// Assuming that szQuote has been appropriately initialized,  
// execute.  
SQLExecute(hstmt);