Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un procedimiento almacenado puede tener cero o más parámetros. También puede devolver un valor. Al usar el proveedor OLE DB de SQL Server Native Client, se pueden pasar parámetros a un procedimiento almacenado:
Codificar de forma rígida el valor de los datos.
Con un marcador de parámetro (?) para especificar parámetros, enlazar una variable de programa al marcador de parámetros y, a continuación, colocar el valor de datos en la variable de programa.
Nota:
Al llamar a procedimientos almacenados de SQL Server mediante parámetros con nombre con OLE DB, los nombres de parámetro deben comenzar con el carácter "@". Se trata de una restricción específica de SQL Server. El proveedor OLE DB de SQL Server Native Client aplica esta restricción más estrictamente que MDAC.
Para admitir parámetros, la interfaz ICommandWithParameters se expone en el objeto de comando. Para usar parámetros, el consumidor describe primero los parámetros para el proveedor llamando al método ICommandWithParameters::SetParameterInfo (o, 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 Ejecutar. En las llamadas posteriores a Execute, el consumidor coloca nuevos valores de parámetro en el búfer y llama a Execute con el identificador de descriptor de acceso y el puntero de búfer.
Un comando que llama a un procedimiento almacenado temporal mediante parámetros debe llamar primero a ICommandWithParameters::SetParameterInfo para definir la información de parámetros, antes de que el comando se pueda preparar correctamente. Esto se debe a que el nombre interno de 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 de un procedimiento almacenado temporal.
Estos son los pasos del proceso de enlace de parámetros:
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 de 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 .
Llame al método ICommandWithParameters::SetParameterInfo para describir los parámetros del proveedor. SetParameterInfo especifica el tipo de datos nativo de cada parámetro. Los argumentos SetParameterInfo son:
Número de parámetros para los que se va a establecer la información de tipo.
Matriz de ordinales de parámetros para los que se va a establecer información de tipo.
Matriz de estructuras DBPARAMBINDINFO.
Cree un descriptor de acceso de parámetro 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 mediante una matriz de estructuras DBBINDING. Cada enlace asocia un único parámetro al búfer del consumidor y contiene información como:
Ordinal del parámetro al que se aplica el enlace.
Lo que está enlazado (el valor de los datos, su longitud y su estado).
Desplazamiento del búfer en cada una de estas partes.
Longitud y tipo del valor de datos tal como existe en el búfer del consumidor.
Un descriptor de acceso se identifica mediante su identificador, que es del tipo HACCESSOR. El método CreateAccessor devuelve este identificador. Siempre que el consumidor termine de usar un descriptor de acceso, el consumidor debe llamar al método ReleaseAccessor para liberar la memoria que contiene.
Cuando el consumidor llama a un método, como ICommand::Execute, pasa el identificador a un descriptor de acceso y un puntero a un búfer. El proveedor usa este descriptor de acceso para determinar cómo transferir los datos contenidos en el búfer.
Rellene la estructura DBPARAMS. Las variables de consumidor de las que se toman los valores de parámetro de entrada y a 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:
Puntero al búfer desde el que el proveedor recupera los datos de parámetros de entrada y al que el proveedor devuelve datos de parámetros de salida, según los enlaces especificados por el identificador de descriptor de acceso.
Número de conjuntos de parámetros en el búfer.
Identificador de descriptor de acceso creado en el paso 3.
Ejecute el comando mediante ICommand::Execute.
Métodos de llamar a un procedimiento almacenado
Al ejecutar un procedimiento almacenado en SQL Server, el proveedor OLE DB de SQL Server Native Client admite:
Secuencia de escape ODBC CALL.
Secuencia de escape de llamada a procedimiento remoto (RPC).
Transact-SQL instrucción EXECUTE.
Secuencia de escape DE LLAMADA ODBC
Si conoce información de parámetros, llame al método ICommandWithParameters::SetParameterInfo para describir los parámetros al proveedor. De lo contrario, cuando se usa la sintaxis ODBC CALL en una llamada a un procedimiento almacenado, el proveedor llama a una función auxiliar para buscar la información del parámetro del procedimiento almacenado.
Si no está seguro de la información de parámetros (metadatos de parámetros), se recomienda la sintaxis ODBC CALL.
La sintaxis general para llamar a un procedimiento mediante la secuencia de escape CALL de ODBC es:
{[?=]llamar aprocedure_name[([parameter][,[parameter]]... )]}
Por ejemplo:
{call SalesByCategory('Produce', '1995')}
Secuencia de escape RPC
La secuencia de escape RPC es similar a la sintaxis ODBC CALL de llamar a un procedimiento almacenado. Si llamará al procedimiento varias veces, la secuencia de escape RPC proporciona un rendimiento más óptimo entre los tres métodos 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 auxiliar para determinar la información del parámetro (como sucede 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 más rápido y mejora el rendimiento. En este caso, debe proporcionar la información de parámetro ejecutando ICommandWithParameters::SetParameterInfo.
La secuencia de escape RPC requiere que tenga un valor devuelto. Si el procedimiento almacenado no devuelve un valor, el servidor devuelve 0 de forma predeterminada. Además, no se puede abrir un cursor de SQL Server en el procedimiento almacenado. El procedimiento almacenado se prepara implícitamente y se producirá un error en la llamada a ICommandPrepare::P repare . Debido a la incapacidad de preparar una llamada RPC, no se pueden consultar 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 manera recomendada de ejecutar procedimientos almacenados.
Este es un ejemplo de secuencia de escape RPC para llamar a un procedimiento almacenado:
{rpc SalesByCategory}
Para obtener una aplicación de ejemplo que muestre una secuencia de escape RPC, vea Ejecutar un procedimiento almacenado (mediante sintaxis RPC) y Procesar códigos de retorno y parámetros de salida (OLE DB) .
instrucción EXECUTE de Transact-SQL
La secuencia de escape ODBC CALL y la secuencia de escape 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 usa 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 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'