Compartir vía


Enlazar parámetros por nombre (parámetros con nombre)

Algunos DBMS permiten que una aplicación especifique los parámetros en un procedimiento almacenado por nombre en lugar de por posición en la llamada a procedimiento. Estos parámetros se denominan parámetros con nombre. ODBC admite el uso de parámetros con nombre. En ODBC, los parámetros con nombre solo se usan en llamadas a procedimientos almacenados y no se pueden usar en otras instrucciones SQL.

El controlador comprueba el valor del campo SQL_DESC_UNNAMED del IPD para determinar si se usan parámetros con nombre. Si SQL_DESC_UNNAMED no está establecido en SQL_UNNAMED, el controlador usa el nombre del campo SQL_DESC_NAME del IPD para identificar el parámetro. Para enlazar el parámetro, una aplicación puede llamar a SQLBindParameter para especificar la información del parámetro y, a continuación, puede llamar a SQLSetDescField para establecer el campo SQL_DESC_NAME del IPD. Cuando se usan parámetros con nombre, el orden del parámetro en la llamada a procedimiento no es importante y se ignora el número de registro del parámetro.

La diferencia entre los parámetros sin nombre y los parámetros con nombre está en la relación entre el número de registro del descriptor y el número de parámetro del procedimiento. Cuando se usan parámetros sin nombre, el primer marcador de parámetro está relacionado con el primer registro del descriptor de parámetros, que a su vez está relacionado con el primer parámetro (en orden de creación) de la llamada a procedimiento. Cuando se usan parámetros con nombre, el primer marcador de parámetro sigue relacionado con el primer registro del descriptor de parámetros, pero la relación entre el número de registro del descriptor y el número de parámetro del procedimiento ya no existe. Los parámetros con nombre no usan la asignación del número de registro del descriptor a la posición del parámetro del procedimiento; en su lugar, el nombre del registro del descriptor se asigna al nombre del parámetro de procedimiento.

Nota:

Si el rellenado automático del IPD está habilitado, el controlador rellenará el descriptor de forma que el orden de los registros del descriptor coincida con el orden de los parámetros de la definición del procedimiento, incluso si se usan parámetros con nombre.

Si se usa un parámetro con nombre, todos los parámetros deben ser parámetros con nombre. Si algún parámetro no es un parámetro con nombre, ninguno de los parámetros puede ser un parámetro con nombre. Si hubiera una combinación de parámetros con nombre y parámetros sin nombre, el comportamiento dependería del controlador.

Como ejemplo de parámetros con nombre, supongamos que se ha definido un procedimiento almacenado de SQL Server como se indica a continuación:

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

En este procedimiento, el primer parámetro, @title_id, tiene un valor predeterminado de 1. Una aplicación puede usar el código siguiente para invocar este procedimiento de forma que especifique solo un parámetro dinámico. Este parámetro es un parámetro con el nombre "@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);