Partilhar via


sp_cursor (Transact-SQL)

Aplica-se a:SQL Server

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

Transact-SQL convenções de sintaxe

Sintaxe

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

Argumentos

Importante

Os argumentos para procedimentos armazenados estendidos devem ser inseridos na ordem específica, conforme descrito na seção de sintaxe. Se os parâmetros forem inseridos fora de ordem, ocorrerá uma mensagem de erro.

cursor

A alça do cursor. O cursor parâmetro é inte não pode ser NULL. Esse parâmetro é o valor handle gerado pelo Mecanismo de Banco de Dados e retornado pelo procedimento sp_cursoropen.

optype

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

Valor Designação Descrição
0X0001 UPDATE É usado para atualizar uma ou mais linhas no buffer de busca. As linhas especificadas em rownum são reacessadas e atualizadas.
0x0002 DELETE É usado para excluir uma ou mais linhas no buffer de busca. As linhas especificadas em de número de linha são reacessadas e excluídas.
0X0004 INSERT Insere dados sem criar uma instrução INSERT.
0X0008 REFRESH É usado para recarregar 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 partilhados (S), mas não com bloqueios exclusivos (X) ou outros bloqueios de atualização. Pode ser usado para implementar o bloqueio de curto prazo.
0X20 SETPOSITION É usado apenas quando o programa vai emitir uma declaração DELETE ou UPDATE subsequente.
0X40 ABSOLUTE Só pode ser utilizado com UPDATE ou DELETE. ABSOLUTE é usado apenas com KEYSET cursores (é ignorado para DYNAMIC cursores) e STATIC cursores não podem ser atualizados.

Nota: 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 do buffer de busca o cursor opera, atualiza ou exclui. Este parâmetro não afeta o ponto de partida de nenhuma operação de busca RELATIVE, NEXTou PREVIOUS, nem quaisquer atualizações ou exclusões realizadas usando sp_cursor.

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

  • 1

    Significa a primeira linha no buffer de busca.

  • 2, 3, 4, ...n

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

  • 0

    Significa todas as linhas no buffer de busca.

Este parâmetro só é válido para uso com UPDATE, DELETE, REFRESHou LOCKoptype valores.

tabela

Nome da tabela que identifica a tabela à qual 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 valor. Se nenhuma tabela específica for designada, o padrão será a primeira tabela na cláusula FROM. A tabela parâmetro é 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.

valor

Usado para inserir ou atualizar valores. O valor parâmetro string só é usado com UPDATE e INSERToptype valores. A cadeia de caracteres pode ser especificada como qualquer caractere ou tipo de dados Unicode.

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

Valores de código de retorno

0 (sucesso) ou 1 (fracasso).

Comentários

O parâmetro optype

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

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

Um benefício de usar o valor INSERT <optype> é que você pode evitar a conversão de dados sem 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 falhará.

  • O valor de SETPOSITION não afeta o ponto de partida de nenhuma operação de busca de RELATIVE, NEXTou PREVIOUS, nem as atualizações ou exclusões realizadas usando a interface sp_cursor. Qualquer número que não especifique uma linha no buffer de busca, resulta na posição sendo definida como 1, sem que nenhum erro seja retornado. Uma vez que SETPOSITION é executado, a posição permanece em vigor até a próxima operação de sp_cursorfetch, operação de FETCH T-SQL ou operação sp_cursorSETPOSITION através do mesmo cursor. Uma operação de sp_cursorfetch subsequente 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 cláusula OR com REFRESH, UPDATE, DELETEou 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 que nenhum erro seja retornado. Uma vez que a posição é definida, ela permanece em vigor até que a próxima operação sp_cursorfetch, operação FETCH T-SQL ou operação sp_cursorSETPOSITION seja executada no mesmo cursor.

SETPOSITION pode ser vinculado por uma cláusula OR com REFRESH, UPDATE, DELETEou 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 por garantir que o controle de simultaneidade seja mantido. Isso significa que, para SCROLL_LOCKS cursores, você deve manter de forma independente um bloqueio na linha determinada (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.

A tabela parâmetro

Se o valor optype for UPDATE ou INSERT e uma instrução completa de atualização ou inserção for enviada como o parâmetro valor, o valor especificado para da tabela será ignorado.

Observação

Referente aos modos de exibição, apenas uma tabela que participa do modo de exibição pode ser modificada. O valor nomes de coluna de parâmetro deve refletir os nomes de coluna na exibição, mas o nome da tabela pode ser o da tabela base subjacente (caso em que sp_cursor substitui o nome da exibição).

O valor parâmetro

Há duas alternativas às regras para usar valor como indicado anteriormente na seção Argumentos:

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

Exemplos

Usos de parâmetros de valor alternativos

Para UPDATE

Quando um único parâmetro é usado, uma instrução UPDATE 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 a tabela parâmetro será ignorado.

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

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

Os parâmetros subsequentes devem assumir a forma de:

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

Nesse caso, o <table_name> na instrução de atualização construída é aquele especificado ou padronizado pelo parâmetro tabela.

Para INSERT

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

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

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

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

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

Os parâmetros subsequentes devem assumir a forma de expression [ , ...n ], exceto nos casos em que VALUES foi especificado, caso em que deve haver um ) à direita após a última expressão. Nesse caso, a <table_name> na instrução UPDATE construída é a especificada ou padronizada pelo parâmetro table.

Observação

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