Share via


sp_cursor (Transact-SQL)

Solicita atualizações posicionadas. Esse procedimento executa operações em uma ou mais linhas dentro do buffer de busca de um cursor. sp_cursor é invocado especificando-se ID = 1 em um pacote TDS.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • cursor
    O identificador de cursor. cursor é um parâmetro obrigatório que requer um valor de entrada int. cursor é o valor de identificador gerado pelo SQL Server e retornado pelo procedimento sp_cursoropen.

  • optype
    É um parâmetro obrigatório que designa qual operação o cursor executará. optype requer um dos valores de entrada int a seguir.

    Valor

    Nome

    Descrição

    0X0001

    UPDATE

    É usado para atualizar uma ou mais linhas no buffer de busca. As linhas especificadas em rownum são novamente acessadas e atualizadas.

    0x0002

    DELETE

    É usado para excluir uma ou mais linhas no buffer de busca. As linhas especificadas em rownum são novamente acessadas e excluídas.

    0X0004

    INSERT

    Insere dados sem criar uma instrução INSERT.

    0X0008

    REFRESH

    É usado para preencher novamente o buffer a partir de tabelas subjacentes e pode ser usado para atualizar a linha se uma atualização ou exclusão falhar devido a controle de simultaneidade otimista, ou após UPDATE.

    0X10

    LOCK

    Faz com que um Bloqueio U do SQL Server seja adquirido na página que contém a linha especificada. Esse bloqueio é compatível com Bloqueios S, mas não com Bloqueios X ou outros Bloqueios U. Pode ser usado para implementar bloqueio a curto prazo.

    0X20

    SETPOSITION

    Será usado apenas quando o programa for emitir uma instrução DELETE ou UPDATE posicionada do SQL Server.

    0X40

    ABSOLUTE

    Pode ser usado apenas junto com UPDATE ou DELETE. ABSOLUTE é usado apenas com cursores KEYSET. Ele é ignorado para cursores DYNAMIC; cursores STATIC não podem ser atualizados.

    ObservaçãoObservação
    Se ABSOLUTE for especificado em uma linha no conjunto de chaves que não foi buscado, a operação poderá causar falha na verificação de simultaneidade e o resultado de retorno não poderá ser garantido.
  • rownum
    Especifica qual das linhas no buffer de busca o cursor irá afetar, atualizar ou excluir.

    ObservaçãoObservação

    Isso não afeta o ponto de partida de qualquer operação de busca RELATIVE, NEXT ou PREVIOUS, nem as atualizações ou exclusões executadas com sp_cursor.

    rownum é um parâmetro obrigatório que requer um valor de entrada int.

    • 1
      Significa a primeira linha no buffer de busca.

    • 2
      Significa a segunda linha no buffer de busca.

    • 3, 4, 5
      Significa a terceira linha, e assim por diante.

    • n
      Significa a enésima linha no buffer de busca.

    • 0
      Significa todas as linhas no buffer de busca.

      ObservaçãoObservação

      É válido apenas para uso com valores de optype UPDATE, DELETE, ATUALIZAÇÃO ou LOCK.

  • table
    Nome de tabela que identifica a tabela à qual optype se aplica, quando a definição de cursor envolve uma junção ou nomes de coluna ambíguos são retornados pelo parâmetro value. Se nenhuma tabela específica for designada, o padrão será a primeira tabela na cláusula FROM. table é um parâmetro opcional que requer um valor de entrada de cadeia de caracteres. A cadeia de caracteres pode ser especificada como qualquer tipo de dados de caractere ou UNICODE. table pode ser um nome de tabela de várias partes.

  • value
    Usado inserir ou atualizar valores. O parâmetro de cadeia de caracteres value é usado apenas com os valores optype UPDATE e INSERT. É possível especificar a cadeia de caracteres como qualquer tipo de dados de caractere ou UNICODE.

    ObservaçãoObservação

    Os nomes de parâmetro para value podem ser atribuídos pelo usuário.

Valores de códigos de retorno

Quando um RPC for usado, uma operação posicionada DELETE ou UPDATE com um número de buffer 0 retornará uma mensagem DONE com um rowcount 0 (falha) ou 1 (êxito) para cada linha no buffer de busca.

Comentários

Parâmetro optype

Com exceção das combinações de SETPOSITION com UPDATE, DELETE, REFRESH ou LOCK; ou ABSOLUTE com UPDATE ou DELETE, os valores de optype são mutuamente exclusivos.

A cláusula SET do valor UPDATE é construída a partir do parâmetro value.

Uma vantagem de usar o valor de optype INSERT é que você pode evitar converter dados não caractere em formato de caractere para inserções. Os valores são especificados da mesma maneira como UPDATE. Se qualquer coluna obrigatório não for incluída, INSERT falhará.

O valor SETPOSITION não afeta o ponto de partida de qualquer operação de busca RELATIVE, NEXT ou PREVIOUS, nem as atualizações ou exclusões executadas com a interface sp_cursor. Qualquer número que não especificar uma linha no buffer de busca resultará na posição sendo definida como 1 sem erro sendo retornado. Quando SETPOSITION for executado, a posição permanecerá em vigor até a próxima operação sp_cursorfetch, Transact-SQL FETCH ou sp_cursor SETPOSITION através do mesmo cursor. Uma operação sp_cursorfetch subsequente definirá a posição do cursor como a primeira linha no novo buffer de busca, enquanto outras chamadas de cursor não afetarão o valor da posição. SETPOSITION pode ser vinculado por uma cláusula OR com REFRESH, UPDATE, DELETE ou LOCK para definir o valor da posição como a última linha modificada.

Se uma linha no buffer de busca não for especificada por meio do parâmetro rownum, a posição será definida como 1, sem erro sendo retornado. Uma vez que a posição seja definida, ela permanecerá em vigor até a próxima operação sp_cursorfetch, Transact-SQL FETCH ou sp_cursor SETPOSITION ser executada no mesmo cursor.

SETPOSITION pode ser vinculado por uma cláusula OR com REFRESH, UPDATE, DELETE ou LOCK para definir a posição do cursor como a última linha modificada.

Parâmetro rownum

Se especificado, o parâmetro rownum pode ser interpretado como o número de linha dentro do conjunto de chaves em vez do número de linha dentro do buffer de busca. O usuário é responsável para assegurar que o controle de simultaneidade seja mantido. Isso significa que, para cursores SCROLL_LOCKS, você deve manter um bloqueio de forma independente na linha determinada (isso pode ser feito por meio de uma transação). Para cursores OPTIMISTIC, você deve ter buscado previamente a linha para executar essa operação.

Parâmetro table

Se o valor de optype for UPDATE ou INSERT e uma instrução update ou insert completa for enviada como o parâmetro value, o valor especificado para table será ignorado.

ObservaçãoObservação

Com relação a exibições, somente uma tabela participante da exibição pode ser modificada. Os nomes de coluna de parâmetro value devem refletir os nomes de coluna na exibição, mas o nome de tabela pode ser aquele da tabela base subjacente (caso em que sp_cursor substituirá o nome da exibição).

Parâmetro value

Há duas alternativas às regras para usar value conforme declarado anteriormente na seção Argumentos:

  1. Você pode usar um nome que tenha '@' anexado ao início do nome da coluna na lista de seleção para qualquer parâmetro value nomeado. Uma vantagem dessa alternativa é que a conversão de dados pode não ser necessária.

  2. Use um parâmetro para enviar uma instrução UPDATE ou INSERT completa ou usar vários parâmetros para enviar partes de uma instrução UPDATE ou INSERT que o SQL Server compilará em uma instrução completa. Exemplos assim podem ser encontrados na seção Exemplos, mais adiante neste tópico. 

Exemplos

Usos alternativos do parâmetro value

Para UPDATE:

Quando um único parâmetro é usado, uma instrução UPDATE pode ser enviada com a seguinte sintaxe:

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

ObservaçãoObservação

Se UPDATE <table name> for especificado, qualquer valor especificado para o parâmetro table será ignorado.

Quando são usados vários parâmetros, o primeiro deve ser uma cadeia de caracteres no seguinte formato:

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

e os parâmetros subsequentes devem estar neste formato:

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

Neste caso, o <table name> na instrução update construída é aquele especificado ou o usado como padrão pelo parâmetro table.

Para INSERT:

Quando um único parâmetro é usado, uma instrução INSERT pode ser enviada com a seguinte sintaxe:

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

ObservaçãoObservação

Se INSERT <table name> for especificado, qualquer valor especificado para o parâmetro table será ignorado.

Quando são usados vários parâmetros, o primeiro deve ser uma cadeia de caracteres no seguinte formato:

[ VALUES ( ] <expression> [,...n]

e os parâmetros subsequentes devem estar neste formato:

expression [,...n]

exceto onde VALUES foi especificado, quando deverá haver um ")" à direita após a última expressão. Neste caso, o <table name> na instrução UPDATE construída é aquele especificado ou o usado como padrão pelo parâmetro table.

ObservaçãoObservação

É possível enviar um parâmetro como um parâmetro nomeado, isto é, "@VALUES". Neste caso, nenhum outro parâmetro nomeado pode ser usado.