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).
Sintaxis
sp_cursoropen
cursor OUTPUT
,
stmt
[, scrollopt[ OUTPUT ] [ , ccopt[ OUTPUT ] [ ,rowcount OUTPUT [ ,boundparam][,...n]]] ]]
Argumentos
cursor
Identificador de cursor generado por SQL Server. El parámetro cursor es un valor de identificador que se debe proporcionar en todos los procedimientos subsiguientes que impliquen al cursor, como sp_cursorfetch. El parámetro cursor es un parámetro necesario con un valor devuelto int.El parámetro cursor permite que varios cursores estén activos en una sola conexión a bases de datos.
stmt
Es un parámetro necesario que define el conjunto de resultados del cursor. Cualquier cadena de consulta válida (sintaxis y enlace) de un tipo de cadena (independiente de Unicode, del tamaño, etc.) puede actuar como un tipo de valor stmt válido.scrollopt
Opción de desplazamiento. El parámetro scrollopt es un parámetro opcional que requiere uno de los siguientes valores de entrada int.Valor
Descripción
0x0001
KEYSET
0x0002
DYNAMIC
0x0004
FORWARD_ONLY
0x0008
STATIC
0x10
FAST_FORWARD
0x1000
PARAMETERIZED_STMT
0x2000
AUTO_FETCH
0x4000
AUTO_CLOSE
0x8000
CHECK_ACCEPTED_TYPES
0x10000
KEYSET_ACCEPTABLE
0x20000
DYNAMIC_ACCEPTABLE
0x40000
FORWARD_ONLY_ACCEPTABLE
0x80000
STATIC_ACCEPTABLE
0x100000
FAST_FORWARD_ACCEPTABLE
Debido a la posibilidad de que el valor solicitado no sea adecuado para el cursor definido a través de stmt, este parámetro actúa tanto de entrada como de salida. En casos como este, SQL Server asigna un valor adecuado.
ccopt
Opción de control de simultaneidad. ccopt es un parámetro opcional que requiere uno de los siguientes valores de entrada int.Valor
Descripción
0x0001
READ_ONLY
0x0002
SCROLL_LOCKS (conocido anteriormente como LOCKCC)
0x0004
OPTIMISTIC (conocido anteriormente como OPTCC)
0x0008
OPTIMISTIC (conocido anteriormente como OPTCCVAL)
0x2000
ALLOW_DIRECT
0x4000
UPDT_IN_PLACE
0x8000
CHECK_ACCEPTED_OPTS
0x10000
READ_ONLY_ACCEPTABLE
0x20000
SCROLL_LOCKS_ACCEPTABLE
0x40000
OPTIMISTIC_ACCEPTABLE
0x80000
OPTIMISITC_ACCEPTABLE
A igual que con scrollopt, SQL Server puede invalidar los valores de ccopt solicitados.
rowcount
Número de filas del búfer de captura que se usan con AUTO_FETCH. El valor predeterminado es 20 filas. rowcount se comporta de manera diferente cuando se asigna como un valor de entrada contra un valor devuelto.Como valor de entrada
Como valor devuelto
Cuando se especifica el valor de scrollopt AUTO_FETCH; rowcount representa el número de filas que se van a colocar en el búfer de captura.
Nota>0 es un valor válido cuando se especifica AUTO_FETCH, de lo contrario se omite.Representa el número de filas en el conjunto de resultados, excepto cuando se especifica el valor AUTO_FETCH de scrollopt.
boundparam
Indica el uso de parámetros adicionales. El parámetro boundparam es un parámetro opcional que se debe especificar si el valor PARAMETERIZED_STMT del parámetro scrollopt se establece en ON.
Valores del código de retorno
Si no se produce ningún error, sp_cursoropen devuelve uno de los siguientes valores.
0
El procedimiento se ejecutó correctamente.0x0001
Se produjo un error durante la ejecución (un error secundario, no lo suficientemente grave como para generar un error en la operación).0x0002
Está en curso una operación asincrónica.0x0002
Está en curso una operación FETCH.A
Este cursor se ha desasignado en SQL Server y no está disponible.
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.
-1
Se devuelve si el número de filas es desconocido o no es aplicable.-n
Se devuelve cuando está en vigor un rellenado asincrónico. Representa el número de filas que se colocaron en el búfer de captura cuando se especifica el valor AUTO_FETCH de scrollopt.
Si se usa una RPC, los valores devueltos son los siguientes.
0
El procedimiento es correcto.1
Se produjo un error en el procedimiento.2
Se genera un cursor de conjunto de claves de forma asincrónica.16
Se ha cerrado automáticamente un cursor de avance rápido.
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.
Comentarios
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.
Ejemplos
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.
Vea también