Compartir a través de


Llamar a un procedimiento almacenado (OLE DB)

Un procedimiento almacenado puede tener cero o más parámetros. También puede devolver un valor. Cuando se utiliza el proveedor OLE DB de SQL Server Native Client, se pueden pasar parámetros a un procedimiento almacenado de los siguientes modos:

  • Codificando de forma rígida el valor de datos.

  • Utilizando un marcador de parámetro (?) para especificar parámetros, enlazar una variable de programa al marcador de parámetro y, a continuación, colocar el valor de datos en la variable de programa.

[!NOTA]

Cuando se llama a procedimientos almacenados de SQL Server utilizando parámetros con nombre con OLE DB, los nombres de parámetro deben empezar con el carácter '@'. Esta es una restricción específica de SQL Server. El proveedor OLE DB de SQL Server Native Client aplica esta restricción de forma más estricta que MDAC.

Para admitir parámetros, se expone la interfaz ICommandWithParameters en el objeto de comando. Para utilizar parámetros, el consumidor describe primero los parámetros al proveedor llamando al método ICommandWithParameters::SetParameterInfo (u opcionalmente prepara una instrucción de llamada para el método GetParameterInfo). A continuación, el consumidor crea un descriptor de acceso que especifica la estructura de un búfer y coloca los valores de parámetro en este búfer. Finalmente, pasa el identificador del descriptor de acceso y un puntero al búfer para Ejecutar. En las llamadas posteriores a Ejecutar, el consumidor coloca nuevos valores de parámetro en el búfer y llama a Ejecutar con el identificador de descriptor de acceso y el puntero de búfer.

Un comando que llama a un procedimiento almacenado temporal utilizando parámetros debe llamar primero a ICommandWithParameters::SetParameterInfo para definir la información de parámetros, antes de que se pueda preparar el comando correctamente. Esto se debe a que el nombre interno para un procedimiento almacenado temporal difiere del nombre externo utilizado por un cliente y SQLOLEDB no puede consultar las tablas del sistema para determinar la información de parámetros para un procedimiento almacenado temporal.

Estos son los pasos en el proceso de enlace de parámetro:

  1. Rellene la información de parámetros en una matriz de estructuras DBPARAMBINDINFO; es decir, el nombre del parámetro, el nombre específico del proveedor para el tipo de datos del parámetro o un nombre del tipo de datos estándar, etc.. Cada estructura de la matriz describe un parámetro. A continuación, esta matriz se pasa al método SetParameterInfo.

  2. Llame al método ICommandWithParameters::SetParameterInfo para describir los parámetros al proveedor. SetParameterInfo especifica el tipo de datos nativo de cada parámetro. Los argumentos de SetParameterInfo son:

    • El número de parámetros para los que se ha de establecer información de tipo.

    • Una matriz de ordinales de parámetros para los que se ha de establecer información de tipo.

    • Una matriz de estructuras DBPARAMBINDINFO.

  3. Cree un descriptor de acceso a parámetros utilizando el comando IAccessor::CreateAccessor. El descriptor de acceso especifica la estructura de un búfer y coloca los valores de parámetro en el búfer. El comando CreateAccessor crea un descriptor de acceso a partir de un conjunto de enlaces. El consumidor describe estos enlaces utilizando una matriz de estructuras DBBINDING. Cada enlace asocia un parámetro único al búfer del consumidor y contiene información como:

    • El ordinal del parámetro al que se aplica el enlace.

    • Lo que se enlaza (el valor de datos, su longitud y su estado).

    • El desplazamiento en el búfer a cada una de estas partes.

    • La longitud y el tipo del valor de datos tal y como está en el búfer del consumidor.

    Un descriptor de acceso queda identificado por su identificador, que es de tipo HACCESSOR. El método CreateAccessor devuelve este identificador. Cada vez que el consumidor termina de utilizar un descriptor de acceso, debe llamar al método ReleaseAccessor para liberar la memoria que utiliza.

    Cuando el consumidor llama a un método, como ICommand::Execute, pasa el identificador a un descriptor de acceso y un puntero al propio búfer. El proveedor utiliza este descriptor de acceso para determinar cómo transferir los datos incluidos en el búfer.

  4. Rellene la estructura DBPARAMS. Las variables del consumidor de las que se toman los valores de parámetro de entrada y en las que se escriben los valores de parámetro de salida se pasan en tiempo de ejecución a ICommand::Execute en la estructura DBPARAMS. La estructura DBPARAMS incluye tres elementos:

    • Un puntero al búfer del que el proveedor recupera los datos de parámetro de entrada y al que devuelve los datos de parámetro de salida, de acuerdo con los enlaces especificados por el identificador de descriptor de acceso.

    • El número de conjuntos de parámetros que hay en el búfer.

    • El identificador de descriptor de acceso creado en el paso 3.

  5. Ejecute el comando utilizando ICommand::Execute.

Métodos para llamar a un procedimiento almacenado

Al ejecutar un procedimiento almacenado en SQL Server, el proveedor OLE DB de SQL Server Native Client admite lo siguiente:

  • Secuencia de escape ODBC CALL.

  • Secuencia de escape RPC (llamada a procedimiento remoto).

  • Transact-SQL Instrucción EXECUTE.

Secuencia de escape ODBC CALL

Si conoce la información de parámetros, llame al método ICommandWithParameters::SetParameterInfo para describir los parámetros al proveedor. De lo contrario, cuando se utiliza la sintaxis ODBC CALL para llamar a un procedimiento almacenado, el proveedor llama a una función auxiliar para buscar la información de parámetros del procedimiento almacenado.

Si no está seguro de la información de parámetros (metadatos de parámetros), es preferible utilizar la sintaxis ODBC CALL.

La sintaxis general para llamar a un procedimiento utilizando la secuencia de escape ODBC CALL es la siguiente:

{[?=]call nombre_procedimiento[([parámetro][,[parámetro]]...)]}

Por ejemplo:

{call SalesByCategory('Produce', '1995')}

Secuencia de escape RPC

La secuencia de escape RPC es similar a la sintaxis ODBC CALL para llamar a un procedimiento almacenado. Si va a llamar al procedimiento varias veces, la secuencia de escape RPC es la que proporciona el rendimiento óptimo de entre los tres métodos existentes para llamar a un procedimiento almacenado.

Cuando se utiliza la secuencia de escape RPC para ejecutar un procedimiento almacenado, el proveedor no llama a ninguna función auxiliar para determinar la información de parámetros (como hace en el caso de la sintaxis ODBC CALL). La sintaxis RPC es más sencilla que la sintaxis ODBC CALL, por lo que el comando se analiza con mayor rapidez y se mejora el rendimiento. En este caso, necesita proporcionar la información de parámetros ejecutando ICommandWithParameters::SetParameterInfo.

La secuencia de escape RPC exige que tenga un valor devuelto. Si el procedimiento almacenado no devuelve un valor, el servidor devuelve de forma predeterminada un 0. Además, no puede abrir un cursor de SQL Server en el procedimiento almacenado. El procedimiento almacenado se prepara implícitamente y la llamada a ICommandPrepare::Prepare producirá un error. Como no se puede preparar una llamada RPC, no se puede realizar una consulta en los metadatos de columna; IColumnsInfo::GetColumnInfo e IColumnsRowset::GetColumnsRowset devolverán DB_E_NOTPREPARED.

Si conoce todos los metadatos de parámetros, la secuencia de escape RPC es la opción recomendada para ejecutar los procedimientos almacenados.

Este es un ejemplo de secuencia de escape RPC para llamar a un procedimiento almacenado:

{rpc SalesByCategory}

Para disponer de una aplicación de ejemplo que muestra una secuencia de escape RPC, vea Ejecutar un procedimiento almacenado (mediante la sintaxis RPC) y procesar códigos de retorno y parámetros de salida (OLE DB).

Instrucción EXECUTE de Transact-SQL:

Las secuencias de escape ODBC CALL y RPC son los métodos preferidos para llamar a un procedimiento almacenado en lugar de la instrucción EXECUTE. El proveedor OLE DB de SQL Server Native Client utiliza el mecanismo RPC de SQL Server para optimizar el procesamiento de comandos. Este protocolo RPC aumenta el rendimiento eliminando gran parte del procesamiento de parámetros y del análisis de instrucciones que se realiza en el servidor.

Este es un ejemplo de la instrucción EXECUTE de Transact-SQL:

EXECUTE SalesByCategory 'Produce', '1995'

Vea también

Otros recursos

Procedimientos almacenados