Compartir a través de


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 RELATIVEoperación de captura , NEXTo 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 UPDATElos valores optype , DELETE, REFRESHo 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.LOCKREFRESHDELETEUPDATESETPOSITION

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 ninguna RELATIVEoperación de captura , NEXTo PREVIOUS , ni realiza ninguna actualización ni eliminaciones realizadas mediante la sp_cursor interfaz . Cualquier número que no especifique una fila en el búfer de captura, da como resultado la posición establecida 1en , sin que se devuelva ningún error. Una vez SETPOSITION ejecutado, la posición permanece en vigor hasta la siguiente sp_cursorfetch operación, operación T-SQL FETCH o sp_cursor SETPOSITION operación a través del mismo cursor. Una operación posterior sp_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 una OR cláusula con REFRESH, UPDATE, DELETEo LOCK 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, DELETEo 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:

  1. 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.

  2. Use un parámetro para enviar una instrucción completa UPDATE o INSERT use varios parámetros para enviar partes de una UPDATE instrucción o INSERT , 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.