sp_cursoropen (Transact-SQL)
Abre un cursor. sp_cursoropen define la instrucción SQL asociada a las opciones de cursor y al cursor, y a continuación lo rellena. sp_cursoropen es equivalente a la combinación de las instrucciones DECLARE_CURSOR y OPEN de Transact-SQL. Este procedimiento se invoca especificando el identificador 2 en un paquete de flujo de datos tabular (TDS).
Convenciones de sintaxis de Transact-SQL
Si no se produce ningún error, sp_cursoropen devuelve uno de los siguientes valores.
Cuando se produce un error, los valores devueltos pueden ser incoherentes y no se puede garantizar la exactitud.
Cuando el parámetro rowcount se especifica como un valor devuelto, se produce el siguiente conjunto de resultados.
Si se usa una RPC, los valores devueltos son los siguientes.
Nota |
|---|
Si el procedimiento sp_cursoropen se ejecuta correctamente, la RPC devuelve los parámetros y se envía un conjunto de resultados con información de formato de columna de TDS (mensajes 0xa0 y 0xa1). Si no puede ejecutarse se envían uno o varios mensajes de error TDS. En cualquier caso, no se devolverán los datos de ninguna fila y el contador de mensajes terminados será igual a cero. Si usa una versión de SQL Server anterior a la 7.0, se devuelven 0xa0, 0xa1 (estándar de las instrucciones SELECT) junto con las flujos de token 0xa5 y 0xa4. Si usa SQL Server 7.0, se devuelve 0x81 (estándar para las instrucciones SELECT) junto con las flujos de token 0xa5 y 0xa4. |
Parámetro stmt
Si stmt especifica la ejecución de un procedimiento almacenado, los parámetros de entrada pueden, o bien definirse como constantes como parte de la cadena stmt, o bien especificarse como argumentos boundparam. Las variables declaradas se pueden pasar como parámetros enlazados de esta manera.
El contenido permitido del parámetro stmt depende de si se ha vinculado o no el valor devuelto ALLOW_DIRECT de ccopt mediante OR al resto de los valores de ccopt, es decir:
Si no se especifica ALLOW_DIRECT, se debe usar una llamada a una instrucción de Transact-SQL SELECT o EXECUTE para un procedimiento almacenado que contenga una sola instrucción SELECT. Además, la instrucción SELECT debe calificarse como un cursor; es decir, no puede contener las palabras clave SELECT INTO, FOR BROWSE ni COMPUTE.
Si se especifica ALLOW_DIRECT, esto puede dar como resultado una o más instrucciones de Transact-SQL, incluso aquellas que, a su vez, ejecuten otros procedimientos almacenados con varias instrucciones. Las instrucciones que no sean SELECT o cualquier instrucción SELECT que contenga las palabras clave SELECT INTO, FOR BROWSE o COMPUTE simplemente se ejecutarán y no darán como resultado la creación de un cursor. Lo mismo puede decirse de cualquier instrucción SELECT incluida en un lote de varias instrucciones. En los casos en los que una instrucción SELECT contenga cláusulas que solo sean relativas a los cursores, dichas cláusulas se omiten. Por ejemplo, cuando el valor de ccopt es 0x2002, esta es una solicitud para:
Un cursor con bloqueos de desplazamiento, si solo hay una instrucción SELECT que se califica como un cursor, o
La ejecución de una instrucción directa si hay varias instrucciones, una sola instrucción distinta de SELECT o una instrucción SELECT que no se califica como un cursor.
Parámetro scrollopt
Los primeros cinco valores de scrollopt (KEYSEY, DYNAMIC, FORWARD_ONLY, STATIC y FAST_FORWARD) son mutuamente excluyentes.
PARAMETERIZED_STMT y CHECK_ACCEPTED_TYPES se pueden vincular mediante OR a cualquiera de los primeros cinco valores.
AUTO_FETCH y AUTO_CLOSE se pueden vincular mediante OR a FAST_FORWARD.
Si CHECK_ACCEPTED_TYPES es ON, al menos uno de los últimos cinco valores de scrollopt (KEYSET_ACCEPTABLE, DYNAMIC_ACCEPTABLE, FORWARD_ONLY_ACCEPTABLE, STATIC_ACCEPTABLE o FAST_FORWARD_ACCEPTABLE) también debe ser ON.
Los cursores STATIC se abren siempre como READ_ONLY. Esto significa que la tabla subyacente no se puede actualizar a través de este cursor.
Parámetro ccopt
Los primeros cuatro valores de ccopt (READ_ONLY, SCROLL_LOCKS y ambos valores OPTIMISTIC) son mutuamente excluyentes.
Nota |
|---|
Al elegir uno de los primeros cuatro valores de ccopt, se determina si el cursor es de solo lectura o si se usan métodos optimistas o de bloqueo para evitar la pérdida de actualizaciones. Si ccopt no tiene especificado un valor, el valor predeterminado es OPTIMISTIC. |
ALLOW_DIRECT y CHECK_ACCEPTED_TYPES se pueden vincular mediante OR a cualquiera de los primeros cuatro valores.
UPDT_IN_PLACE se puede vincular mediante OR a READ_ONLY, SCROLL_LOCKS o a cualquiera de los valores OPTIMISTIC.
Si CHECK_ACCEPTED_TYPES es ON, al menos uno de los últimos cuatro valores de ccopt (READ_ONLY_ACCEPTABLE, SCROLL_LOCKS_ACCEPTABLE y cualquiera de los valores OPTIMISTIC_ACCEPTABLE) también debe ser ON.
Las funciones UPDATE y DELETE colocadas solo se pueden realizar dentro del búfer de captura y únicamente si el valor de ccopt es igual a SCROLL_LOCKS u OPTIMISTIC. Si SCROLL_LOCKS es el valor especificado, se garantiza que la operación se realiza correctamente. Si el valor especificado es OPTIMISTIC, se producirá un error en la operación si la fila ha cambiado desde que se capturó en último lugar.
La razón de este error es que cuando el valor especificado es OPTIMISTIC, una función de control de simultaneidad optimista se realiza comparando las marcas de tiempo o los valores de las sumas de comprobación, según determina SQL Server. Si alguna de estas filas no coincide, se producirá un error en la operación.
Especificar UPDT_IN_PLACE como valor devuelto produce los siguientes resultados:
Si no está establecido al realizar una actualización colocada en una tabla con un único índice, el cursor elimina la fila de su tabla de trabajo y la inserta al final de alguna de las columnas de clave que usa el cursor, con lo que las cambia.
Si está establecida en ON, el cursor simplemente actualizará las columnas de clave en la fila original de la tabla de trabajo.
Parámetro bound_param
El nombre de parámetro debería ser paramdef cuando se especifica PARAMETERIZED_STMT, según el mensaje de error del código. Cuando no se especifica PARAMETERIZED_STMT, no se especifica ningún nombre en el mensaje de error.
Consideraciones sobre RPC
La marca de entrada RPC RETURN_METADATA puede establecerse en 0x0001 para solicitar que se devuelvan los metadatos de la lista de selección del cursor en el flujo de TDS.
Parámetro bound_param
Cualquier parámetro después del quinto se pasa como parámetro de entrada al plan de instrucción. El primer parámetro debe ser una cadena con el formato:
{ local variable name data type } [,…n]
Los parámetros subsiguientes se utilizan para pasar los valores que se van a sustituir para el parámetro local variable name en la instrucción.
