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

Se aplica a: SQL Server (desde SQL Server 2008 [10.0.x] hasta la versión actual).

Convenciones de sintaxis de Transact-SQL

Sintaxis

  
sp_cursor  cursor, optype, rownum, table  
    [ , value[...n]]]  

Argumentos

cursor
El identificador de cursor. cursor es un parámetro necesario que llama a para un valor de entrada int . cursor es el valor de identificador generado por SQL Server y devuelto por el procedimiento sp_cursoropen.

optype
Es un parámetro necesario que designa qué operación realizará el cursor. optype requiere uno de los siguientes valores de entrada int .

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 filas se vuelven a tener acceso y se actualizan.
0x0002 Delete Se usa para eliminar una o varias filas en el búfer de captura. Se vuelve a acceder a las filas especificadas en el número de fila y se eliminan.
0X0004 INSERT Inserta datos sin compilar una instrucción SQL INSERT .
0X0008 REFRESH Se usa para rellenar el búfer a partir de las tablas subyacentes y se puede usar para actualizar la fila si una actualización o eliminación no puede realizarse debido a un control de simultaneidad optimista o después de una operación UPDATE.
0X10 LOCK Hace que se adquiera un SQL Server U-Lock en la página que contiene la fila especificada. Este bloqueo es compatible con los bloqueos S. No es compatible con los bloqueos X ni U. Se puede usar para implementar el bloqueo a corto plazo.
0X20 SETPOSITION Solo se usa cuando el programa va a emitir una instrucción DELETE o UPDATE posteriores SQL Server.
0X40 ABSOLUTE Solo se puede usar junto con UPDATE o DELETE. ABSOLUTE solo se emplea con cursores KEYSET (se omite para los cursores DYNAMIC y los cursores STATIC no se pueden actualizar).

Nota: Si se especifica ABSOLUTE en una fila del conjunto de claves que no se ha capturado, la operación puede producir un error en la comprobación de simultaneidad y no se puede garantizar el resultado devuelto.

rownum
Especifica con cuál de las filas del búfer de captura operará el cursor, cuál actualizará o cuál eliminará.

Nota

Esto no afecta al punto inicial de ninguna operación de captura RELATIVE, NEXT o PREVIOUS, ni a las actualizaciones ni eliminaciones realizadas con sp_cursor.

rownum es un parámetro obligatorio que llama a para un valor de entrada int .

1
Indica la primera fila del búfer de captura.

2
Indica la segunda fila del búfer de captura.

3, 4, 5
Indica la tercera fila, etc.

n
Indica la enésima fila del búfer de captura.

0
Indica todas las filas del búfer de captura.

Nota

Solo es válido para su uso con los valores de optype UPDATE, 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 nombres de columna ambiguos los devuelve el parámetro value . Si no se designa ninguna tabla específica, el valor predeterminado es la primera tabla de la cláusula FROM. table es un parámetro opcional que requiere un valor de entrada string. La cadena se puede especificar como cualquier tipo de datos UNICODE o carácter. table puede ser 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 valores optype UPDATE e INSERT. La cadena se puede especificar como cualquier tipo de datos UNICODE o carácter.

Nota

El usuario puede asignar los nombres de parámetro para el valor .

Valores de código de retorno

Cuando se usa una RPC, una operación DELETE o UPDATE posicionada con un número de búfer 0 devolverá un mensaje DONE con un recuento de filas de 0 (error) o 1 (correcto) para cada fila del búfer de captura.

Comentarios

Parámetro optype

A excepción de las combinaciones de SETPOSITION con UPDATE, DELETE, REFRESH o LOCK; o ABSOLUTE con UPDATE o DELETE, los valores de optype son mutuamente excluyentes.

La cláusula SET del valor UPDATE se construye a partir del parámetro value .

Una ventaja de usar el valor de optype INSERT 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 para UPDATE. Si alguna columna necesaria no está incluida, se produce un error en INSERT.

  • El valor SETPOSITION no afecta al punto inicial de ninguna operación de captura RELATIVE, NEXT o PREVIOUS, ni hace ninguna actualización ni eliminación que se efectúe con la interfaz sp_cursor. Cualquier número que no especifique una fila en el búfer de captura hará que la posición se establezca en 1 y no se devuelva ningún error. Una vez que se ejecuta SETPOSITION, la posición permanece en vigor hasta la siguiente operación de sp_cursorfetch, operación FETCH de T-SQL o sp_cursor operación SETPOSITION a través del mismo cursor. La siguiente operación sp_cursorfetch establecerá la posición del cursor en la primera fila del nuevo búfer de captura, mientras que otras llamadas del cursor no afectarán al valor de la posición. Una cláusula OR con REFRESH, UPDATE, DELETE o LOCK puede vincular SETPOSITION 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 establecerá en 1, sin que se devuelva ningún error. Una vez establecida la posición, permanece en vigor hasta que se realiza la siguiente operación sp_cursorfetch, FETCH de T-SQL o sp_cursor SETPOSITION en el mismo cursor.

SETPOSITION puede vincularse con cualquier cláusula 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 los cursores SCROLL_LOCKS, debe mantener independientemente un bloqueo en la fila dada (esto se puede hacer a través de una transacción). En el caso de los cursores optimistas, debe haber capturado previamente la fila para realizar esta operación.

Parámetro table

Si el valor de optype es UPDATE o INSERT y se envía una instrucción update o insert completa como parámetro value , se omite el valor especificado para table .

Nota

En relación con 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 la tabla puede ser el de la tabla base subyacente (en cuyo caso sp_cursor reemplazará 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 que sea "@" pre-pendded para el nombre de la columna en la lista de selección para los parámetros de valor con nombre . Una ventaja de esta alternativa es que la conversión de datos puede no ser necesaria.

  2. Use un parámetro para enviar una instrucción UPDATE o INSERT completa o use varios parámetros para enviar partes de una instrucción UPDATE o INSERT que SQL Server compilará en una instrucción completa. Puede encontrar ejemplos de esto en la sección Ejemplos, posteriormente en este tema.

Ejemplos

Usos alternativos del parámetro value

Para UPDATE:

Cuando se utiliza un solo parámetro, se puede enviar una instrucción UPDATE con la siguiente sintaxis:

[ [ UPDATE <table name> ] SET ] {<column name> = expression} [,...n]

Nota

Si se especifica UPDATE <nombre> de tabla, se omitirá 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]

y los parámetros subsiguientes deben estar en el formato:

<column name> = expression [,...n]

En este caso, el <nombre> de la tabla de la instrucción de actualización construida es el especificado o predeterminado por el parámetro table .

Para INSERT:

Cuando se utiliza un solo parámetro, se puede enviar una instrucción INSERT con la siguiente sintaxis:

[ [ INSERT [INTO] <table name> ] VALUES ] ( <expression> [,...n] )

Nota

Si se especifica insert <table name> , se omitirá 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]

y los parámetros subsiguientes deben estar en el formato:

expression [,...n]

excepto cuando se especificó VALUES, en cuyo caso debe haber un carácter ")" final después de la última expresión. En este caso, el <nombre> de tabla de la instrucción UPDATE construida es el especificado o predeterminado por el parámetro table.

Nota

Es posible enviar un parámetro como un parámetro con nombre, es decir "@VALUES". En este caso no se pueden usar otros parámetros con nombre.

Consulte también

sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
Procedimientos almacenados del sistema (Transact-SQL)