Compartilhar via


sp_cursor (Transact-SQL)

Aplica-se: SQL Server

Solicita atualizações posicionadas. Este procedimento executa operações em uma ou mais linhas no buffer de busca de um cursor. sp_cursor é invocado especificando ID = 1 em um pacote TDS (fluxo de dados tabulares).

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

cursor

O identificador do cursor. O parâmetro cursor é int e não pode ser NULL. Esse parâmetro é o handle valor gerado pelo Mecanismo de Banco de Dados e retornado pelo sp_cursoropen procedimento.

tipo de operação

Um parâmetro obrigatório que designa qual operação o cursor executa. O parâmetro optype requer um dos seguintes valores.

Valor Nome Descrição
0X0001 UPDATE É usado para atualizar uma ou mais linhas no buffer de busca. As linhas especificadas em rownum são acessadas novamente e atualizadas.
0x0002 DELETE É usado para excluir uma ou mais linhas no buffer de busca. As linhas especificadas em rownum são reacessadas e excluídas.
0X0004 INSERT Insere dados sem criar uma INSERT instrução.
0X0008 REFRESH É usado para reabastecer o buffer de tabelas subjacentes e pode ser usado para atualizar a linha se uma atualização ou exclusão falhar devido ao controle de simultaneidade otimista ou após um UPDATE.
0X10 LOCK Faz com que um bloqueio de atualização (U) seja adquirido na página que contém a linha especificada. Este bloqueio é compatível com bloqueios compartilhados (S), mas não com bloqueios exclusivos (X) ou outros bloqueios de atualização. Pode ser usado para implementar bloqueio a curto prazo.
0X20 SETPOSITION É usado somente quando o programa vai emitir uma instrução ou UPDATE subsequenteDELETE.
0X40 ABSOLUTE Só pode ser usado com UPDATE ou DELETE. ABSOLUTE é usado apenas com KEYSET cursores (é ignorado para DYNAMIC cursores) e STATIC os cursores não podem ser atualizados.

Observação: se ABSOLUTE for especificado em uma linha no conjunto de chaves que não foi buscada, a operação poderá falhar na verificação de simultaneidade e o resultado do retorno não poderá ser garantido.

rownum

Especifica em qual das linhas no buffer de busca o cursor opera, atualiza ou exclui. Esse parâmetro não afeta o ponto de partida de nenhuma RELATIVEoperação , NEXT, ou PREVIOUS fetch, nem quaisquer atualizações ou exclusões executadas usando sp_cursor.

rownum é um parâmetro necessário que chama um valor de entrada int .

  • 1

    Significa a primeira linha no buffer de busca.

  • 2, 3, 4, ...n

    Significa a segunda, terceira e quarta linha, e assim por diante.

  • 0

    Significa todas as linhas no buffer de busca.

Esse parâmetro só é válido para uso com UPDATEvalores , DELETE, REFRESH, ou LOCK optype .

table

Nome da tabela que identifica a tabela à qual o optype se aplica quando a definição do 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 da FROM cláusula. O parâmetro table é opcional e requer um valor de entrada de cadeia de caracteres. A cadeia de caracteres pode ser especificada como qualquer caractere ou tipo de dados Unicode ou um nome de tabela de várias partes.

value

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

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

Valores do código de retorno

0 (sucesso) ou 1 (falha).

Comentários

O parâmetro optype

Exceto para as combinações de com , , , ou LOCK; ou ABSOLUTE com ou UPDATE , DELETEos valores de SETPOSITION optype são mutuamente exclusivos. REFRESHDELETEUPDATE

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

Um benefício de usar o INSERT <optype> valor é que você pode evitar a conversão de dados que não são de caracteres em formato de caractere para inserções. Os valores são especificados da mesma forma que UPDATE. Se alguma coluna necessária não for incluída, o INSERT campo falhará.

  • O SETPOSITION valor não afeta o ponto de partida de nenhuma RELATIVEoperação , NEXT, ou PREVIOUS fetch, nem nenhuma atualização ou exclusão executada usando a sp_cursor interface. Qualquer número que não especifique uma linha no buffer de busca resulta na configuração da posição como 1, sem que nenhum erro seja retornado. Depois SETPOSITION de executada, a posição permanece em vigor até a próxima sp_cursorfetch operação, operação T-SQL FETCH ou sp_cursor SETPOSITION operação por meio do mesmo cursor. Uma operação subsequente sp_cursorfetch define a posição do cursor para a primeira linha no novo buffer de busca, enquanto outras chamadas de cursor não afetam o valor da posição. SETPOSITION pode ser vinculado por uma OR cláusula com REFRESH, UPDATE, DELETE, ou LOCK para definir o valor da posição para 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 nenhum erro retornado. Depois que a posição é definida, ela permanece em vigor até que a próxima sp_cursorfetch operação, operação T-SQL FETCH ou sp_cursor SETPOSITION operação seja executada no mesmo cursor.

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

O parâmetro rownum

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

O parâmetro table

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

Observação

Pertencente a modos de exibição, apenas uma tabela que participa do modo de exibição pode ser modificada. Os nomes de coluna do parâmetro de valor devem refletir os nomes de coluna na exibição, mas o nome da tabela pode ser o da tabela base subjacente (nesse caso sp_cursor , substitui o nome da exibição).

O parâmetro value

Há duas alternativas às regras de uso de valor , conforme declarado anteriormente na seção Argumentos:

  1. Você pode usar um nome que é @ anexado ao nome da coluna na lista de seleção para qualquer parâmetro de valor 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 or INSERT completa UPDATE ou use vários parâmetros para enviar partes de uma UPDATE instrução orINSERT, que o Mecanismo de Banco de Dados cria em uma instrução complete. Os exemplos podem ser encontrados na seção Exemplos mais adiante neste artigo.

Exemplos

Usos de parâmetro de valor alternativo

Para ATUALIZAÇÃO

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

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

Se UPDATE <table_name> for especificado, qualquer valor especificado para o parâmetro de tabela 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 ]

Os parâmetros subsequentes devem estar na forma de:

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

Nesse caso, a <table_name> instrução in the constructed update é aquela especificada ou padronizada pelo parâmetro table .

Para INSERIR

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

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

Se INSERT <table_name> for especificado, qualquer valor especificado para o parâmetro de tabela será ignorado.

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

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

Os parâmetros subsequentes devem estar na forma de expression [ , ...n ], exceto onde VALUES foi especificado, caso em que deve haver um trailing ) após a última expressão. Nesse caso, a <table_name> instrução in the constructed UPDATE é aquela especificada ou padronizada pelo parâmetro table .

Observação

É possível enviar um parâmetro como um parâmetro nomeado, por exemplo @values. Nesse caso, nenhum outro parâmetro nomeado pode ser usado.