sp_cursor (Transact-SQL)
Se aplica a: SQL Server
Solicita actualizaciones posicionadas. Este procedimiento realiza las operaciones en una o más filas dentro del búfer de captura de un cursor. sp_cursor
se invoca especificando ID = 1
en un paquete de flujo de datos tabular (TDS).
Convenciones de sintaxis de Transact-SQL
Sintaxis
sp_cursor cursor , optype , rownum , table
[ , value [ ...n ] ]
[ ; ]
Argumentos
cursor
El identificador de cursor. El parámetro de cursor es int y no puede ser NULL
. Este parámetro es el handle
valor generado por el Motor de base de datos y devuelto por el sp_cursoropen
procedimiento .
optype
Parámetro necesario que designa la operación que realiza el cursor. El parámetro optype requiere uno de los siguientes valores.
Valor | Nombre | Descripción |
---|---|---|
0X0001 |
UPDATE |
Se usa para actualizar una o varias filas en el búfer de captura. Las filas especificadas en el número de fila se vuelven a acceder y actualizan. |
0x0002 |
DELETE |
Se usa para eliminar una o varias filas en el búfer de captura. Las filas especificadas en el número de fila se vuelven a acceder y eliminan. |
0X0004 |
INSERT |
Inserta datos sin crear una INSERT instrucción . |
0X0008 |
REFRESH |
Se usa para rellenar el búfer de las tablas subyacentes y se puede usar para actualizar la fila si se produce un error en una actualización o eliminación debido al control de simultaneidad optimista o después de .UPDATE |
0X10 |
LOCK |
Hace que se adquiera un bloqueo de actualización (U) en la página que contiene la fila especificada. Este bloqueo es compatible con bloqueos compartidos (S), pero no con bloqueos exclusivos (X) u otros bloqueos de actualización. Se puede usar para implementar el bloqueo a corto plazo. |
0X20 |
SETPOSITION |
Solo se usa cuando el programa va a emitir una instrucción o UPDATE posteriorDELETE . |
0X40 |
ABSOLUTE |
Solo se puede usar con UPDATE o DELETE . ABSOLUTE solo se usa con KEYSET cursores (se omiten los DYNAMIC cursores) y STATIC los cursores no se pueden actualizar.Nota: Si ABSOLUTE se especifica en una fila del conjunto de claves que no se ha capturado, es posible que la operación produzca un error en la comprobación de simultaneidad y no se pueda garantizar el resultado devuelto. |
rownum
Especifica en qué filas del búfer de captura opera el cursor, las actualizaciones o las eliminaciones. Este parámetro no afecta al punto de partida de ninguna RELATIVE
operación de captura , NEXT
o PREVIOUS
, ni a las actualizaciones o eliminaciones realizadas mediante sp_cursor
.
rownum es un parámetro necesario que llama a para un valor de entrada int .
1
Indica la primera fila del búfer de captura.
2, 3, 4, ...n
Indica la segunda, tercera y cuarta fila, etc.
0
Indica todas las filas del búfer de captura.
Este parámetro solo es válido para su uso con UPDATE
los valores optype , DELETE
, REFRESH
o LOCK
.
table
Nombre de tabla que identifica la tabla a la que se aplica optype cuando la definición del cursor implica una combinación o el parámetro value devuelve nombres de columna ambiguos. Si no se designa ninguna tabla específica, el valor predeterminado es la primera tabla de la FROM
cláusula . El parámetro table es opcional y requiere un valor de entrada de cadena. La cadena se puede especificar como cualquier carácter o tipo de datos Unicode o un nombre de tabla de varias partes.
value
Se usa para insertar o actualizar valores. El parámetro de cadena de valor solo se usa con UPDATE
los valores optype y INSERT
. La cadena se puede especificar como cualquier tipo de datos Unicode o de caracteres.
El usuario puede asignar los nombres de parámetro para el valor .
Valores de código de retorno
0
(correcto) o 1
(erróneo).
Comentarios
Parámetro optype
Excepto las combinaciones de con , , o , o ABSOLUTE
con UPDATE
o DELETE
, los valores optype son mutuamente excluyentes.LOCK
REFRESH
DELETE
UPDATE
SETPOSITION
La SET
cláusula del UPDATE
valor se construye a partir del parámetro value .
Una ventaja de usar el INSERT <optype>
valor es que puede evitar la conversión de datos que no son de caracteres en formato de caracteres para las inserciones. Los valores se especifican de la misma manera que UPDATE
. Si no se incluyen columnas necesarias, se produce un INSERT
error.
- El
SETPOSITION
valor no afecta al punto inicial de ningunaRELATIVE
operación de captura ,NEXT
oPREVIOUS
, ni realiza ninguna actualización ni eliminaciones realizadas mediante lasp_cursor
interfaz . Cualquier número que no especifique una fila en el búfer de captura, da como resultado la posición establecida1
en , sin que se devuelva ningún error. Una vezSETPOSITION
ejecutado, la posición permanece en vigor hasta la siguientesp_cursorfetch
operación, operación T-SQLFETCH
osp_cursor
SETPOSITION
operación a través del mismo cursor. Una operación posteriorsp_cursorfetch
establece la posición del cursor en la primera fila del nuevo búfer de captura, mientras que otras llamadas de cursor no afectan al valor de la posición.SETPOSITION
se puede vincular mediante unaOR
cláusula conREFRESH
,UPDATE
,DELETE
oLOCK
para establecer el valor de la posición en la última fila modificada.
Si no se especifica una fila en el búfer de captura a través del parámetro rownum , la posición se establece en 1, sin que se devuelva ningún error. Una vez establecida la posición, permanece en vigor hasta que se realiza la siguiente sp_cursorfetch
operación, operación T-SQL FETCH
o sp_cursor
SETPOSITION
operación en el mismo cursor.
SETPOSITION
se puede vincular mediante una OR
cláusula con REFRESH
, UPDATE
, DELETE
o LOCK
para establecer la posición del cursor en la última fila modificada.
Parámetro rownum
Si se especifica, el parámetro rownum se puede interpretar como el número de fila dentro del conjunto de claves en lugar del número de fila dentro del búfer de captura. El usuario es responsable de asegurarse de que el control de simultaneidad se mantenga. Esto significa que, para SCROLL_LOCKS
los cursores, debe mantener de forma independiente un bloqueo en la fila especificada (que se puede realizar a través de una transacción). En OPTIMISTIC
el caso de los cursores, debe haber capturado previamente la fila para realizar esta operación.
Parámetro table
Si el valor optype es UPDATE
o y se envía una instrucción de actualización completa INSERT
o inserción como parámetro value , se omite el valor especificado para la tabla .
Nota:
Perteneciente a las vistas, solo se puede modificar una tabla que participa en la vista. Los nombres de columna de parámetro de valor deben reflejar los nombres de columna en la vista, pero el nombre de tabla puede ser el de la tabla base subyacente (en cuyo caso sp_cursor
sustituye el nombre de la vista).
Parámetro value
Hay dos alternativas a las reglas para usar el valor como se indicó anteriormente en la sección Argumentos:
Puede usar un nombre antepuesto
@
al nombre de la columna de la lista de selección para cualquier parámetro de valor con nombre. Una ventaja de esta alternativa es que es posible que la conversión de datos no sea necesaria.Use un parámetro para enviar una instrucción completa
UPDATE
oINSERT
use varios parámetros para enviar partes de unaUPDATE
instrucción oINSERT
, que el Motor de base de datos compila en una instrucción completa. Puede encontrar ejemplos en la sección Ejemplos más adelante en este artículo.
Ejemplos
Usos de parámetros de valor alternativos
Para UPDATE
Cuando se usa un único parámetro, se puede enviar una UPDATE
instrucción mediante la sintaxis siguiente:
[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]
Si UPDATE <table_name>
se especifica , se omite cualquier valor especificado para el parámetro table .
Cuando se utilizan varios parámetros, el primero debe ser una cadena con el siguiente formato:
[ SET ] <column name> = expression [ , ...n ]
Los parámetros siguientes deben estar en forma de:
<column name> = expression [ , ...n ]
En este caso, en <table_name>
la instrucción de actualización construida es la especificada o predeterminada por el parámetro table .
Para INSERT
Cuando se usa un único parámetro, se puede enviar una INSERT
instrucción mediante la sintaxis siguiente:
[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )
Si INSERT <table_name>
se especifica , se omite cualquier valor especificado para el parámetro table .
Cuando se utilizan varios parámetros, el primero debe ser una cadena con el siguiente formato:
[ VALUES ] ( <expression> [ , ...n ] )
Los parámetros posteriores deben estar en forma de , excepto donde VALUES
se especificó, en cuyo caso debe haber un final )
después de expression [ , ...n ]
la última expresión. En este caso, en <table_name>
la instrucción construida UPDATE
es el especificado o predeterminado por el parámetro table .
Nota:
Es posible enviar un parámetro como parámetro con nombre, por ejemplo @values
. En este caso, no se pueden usar otros parámetros con nombre.