Compartir a través de


Llamada a un procedimiento almacenado (OLE DB)

Se aplica a: SQL Server Azure SQL Database Azure SQL Instancia administrada Azure Synapse Analytics Analytics Platform System (PDW)

Descargar controlador OLE DB

Un procedimiento almacenado puede tener cero o más parámetros. También puede devolver un valor. Al usar OLE DB Driver for SQL Server, se pueden pasar parámetros a un procedimiento almacenado de las siguientes maneras:

  • 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 mediante parámetros con nombre con OLE DB, los nombres de parámetro deben empezar con el carácter "@". Se trata de una restricción específica de SQL Server. OLE DB Driver for SQL Server 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 usar parámetros, el cliente primero describe los parámetros al proveedor mediante una llamada al método ICommandWithParameters::SetParameterInfo (u opcionalmente prepara una instrucción de llamada que llama al 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. Por último, pasa el identificador del descriptor de acceso y un puntero al búfer a Execute. En las llamadas posteriores a Execute, el cliente coloca nuevos valores de parámetro en el búfer y llama a Execute con el identificador del descriptor de acceso y el puntero al búfer.

Un comando que llama a un procedimiento almacenado temporal mediante parámetros primero debe llamar a ICommandWithParameters::SetParameterInfo para definir la información de los parámetros. Esta llamada se debe realizar antes de que se pueda preparar correctamente el comando. Este requisito se debe a que el nombre interno de un procedimiento almacenado temporal difiere del nombre externo usado por un cliente. MSOLEDBSQL no puede consultar las tablas del sistema para determinar la información de los parámetros de un procedimiento almacenado temporal.

Los elementos siguientes son los pasos en el proceso de enlace de parámetros:

  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. Luego 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 mediante 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 cliente termina de usar un descriptor de acceso, debe llamar al método ReleaseAccessor para liberar la memoria que retiene.

    Cuando el cliente llama a un método, como ICommand::Execute, pasa automáticamente el identificador a un descriptor de acceso y un puntero a un 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 cliente 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 mediante ICommand::Execute.

Métodos para llamar a un procedimiento almacenado

Al ejecutar un procedimiento almacenado en SQL Server, OLE DB Driver for SQL Server admite lo siguiente:

  • Secuencia de escape ODBC CALL.
  • Secuencia de escape RPC (llamada a procedimiento remoto).
  • Instrucción EXECUTE de Transact-SQL.

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 del asistente para buscar la información de parámetros del procedimiento almacenado.

Si no está seguro de la información de los parámetros (metadatos de parámetros), se recomienda usar la sintaxis ODBC CALL.

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

{[?=]callnombre_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. Al llamar al procedimiento muchas veces, la secuencia de escape RPC es la que ofrece mejor rendimiento de las tres maneras de llamar a un procedimiento almacenado.

Cuando se usa la secuencia de escape RPC para ejecutar un procedimiento almacenado, el proveedor no llama a ninguna función de asistente para determinar la información de parámetros (como hace con 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 mediante la ejecución de ICommandWithParameters::SetParameterInfo.

La secuencia de escape RPC exige que tenga un valor devuelto. Si el procedimiento almacenado no devuelve ningún valor, el servidor devuelve un 0 de forma predeterminada. Además, no se puede abrir un cursor SQL Server en el procedimiento almacenado. El procedimiento almacenado se prepara de forma implícita y la llamada a ICommandPrepare::Prepare produce 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 código SQL es un ejemplo de secuencia de escape RPC para llamar a un procedimiento almacenado:

{rpc SalesByCategory}

Si quiere ver una aplicación de ejemplo que muestre una secuencia de escape RPC, consulte Ejecución de un procedimiento almacenado (mediante sintaxis RPC) y procesamiento de códigos de devolución 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. OLE DB Driver for SQL Server emplea el mecanismo RPC de SQL Server para optimizar el procesamiento de comandos. El protocolo RPC aumenta el rendimiento mediante la eliminación de gran parte del procesamiento de parámetros y análisis de instrucciones que se realiza en el servidor.

El código SQL siguiente es un ejemplo de la instrucción EXECUTE de Transact-SQL:

EXECUTE SalesByCategory 'Produce', '1995'

Vea también

procedimientos almacenados