Share via


sp_cursor (Transact-SQL)

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 el identificador igual a 1 en un paquete de flujo de datos tabular (TDS).

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • cursor
    El identificador de cursor. El parámetro cursor es un parámetro necesario que requiere un valor de entrada int. El parámetro cursor es el valor de identificador que genera SQL Server y devuelve el procedimiento sp_cursoropen.

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

    Valor

    Nombre

    Descripción

    0X0001

    UPDATE

    Se usa para actualizar una o varias filas en el búfer de captura. Se vuelve a tener acceso a las filas especificadas en rownum y se actualizan.

    0x0002

    DELETE

    Se usa para eliminar una o varias filas en el búfer de captura. Se vuelve a tener acceso a las filas especificadas en rownum y se eliminan.

    0X0004

    INSERT

    Inserta los datos sin generar ninguna instrucción 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 bloqueo U de SQL Server 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 de SQL Server posicionada posterior.

    0X40

    ABSOLUTE

    Solo se puede usar junto con UPDATE o DELETE. ABSOLUTE solo se usa con cursores KEYSET. Se ignora para los cursores DYNAMIC y no se pueden actualizar los cursores STATIC.

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

    El parámetro rownum es un parámetro necesario que requiere 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 se puede usar con los valores de optype UPDATE, DELETE, REFRESH o LOCK.

  • table
    Nombre que identifica la tabla a la que optype se aplica cuando la definición de cursor implica una unión o el parámetro value devuelve nombres de columna ambiguos. Si no se designa ninguna tabla concreta, el valor predeterminado es la primera tabla de la cláusula FROM. El parámetro table es un parámetro opcional que requiere un valor de entrada de tipo cadena. La cadena se puede especificar como cualquier carácter o tipo de datos UNICODE. El parámetro table puede ser un nombre de tabla de varias partes.

  • value
    Se usa para insertar o actualizar valores. El parámetro de la cadena value se utiliza solo con valores optype de 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 value.

Valores del código de retorno

Si se usa una llamada a procedimiento remoto (RPC), una operación DELETE o UPDATE colocada con un número de búfer 0 devolverá un mensaje DONE con un rowcount de 0 (erróneo) o de 1 (correcto) para cada fila del búfer de captura.

Comentarios

Parámetro optype

Con la 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 del uso del valor optype de INSERT es que se puede evitar la conversión de los datos que no son caracteres en el formato de carácter 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 ejecutada la operación SETPOSITION, la posición permanece en vigor hasta la siguiente operación sp_cursorfetch, FETCH de Transact-SQL o sp_cursor 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 una fila del búfer de captura no se especifica a través del parámetro rownum, la posición se establecerá en 1 y no se devolverá ningún error. Una vez establecida la posición, permanece en vigor hasta que se realice la siguiente operación sp_cursorfetch, FETCH de Transact-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 actualización completa o una inserción 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 del parámetro value 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 sustituirá al nombre de vista).

Parámetro value

Hay dos alternativas a las reglas para usar el parámetro value como se indicaba anteriormente en la sección Argumentos:

  1. Puede utilizar un nombre que tenga anexado '@' al principio del nombre de la columna en la lista de selección para cualquier parámetro value con nombre. Una ventaja de esta alternativa es que la conversión de datos puede no ser necesaria.

  2. Utilice un parámetro para enviar una instrucción INSERT o UPDATE completa, o varios parámetros para enviar partes de una instrucción INSERT o UPDATE que SQL Server integrará a continuación 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 tabla> en la instrucción de actualización construida es el especificado por el parámetro table o su valor predeterminado.

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<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:

[ 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> en la instrucción UPDATE construida es el especificado por el parámetro table o su valor predeterminado.

Nota

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