sp_cursor (Transact-SQL)
Aplica-se a: 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 tabular).
Aplica-se a: SQL Server [SQL Server 2008 (10.0.x) à versão atual]. |
Convenções de sintaxe de Transact-SQL
Sintaxe
sp_cursor cursor, optype, rownum, table
[ , value[...n]]]
Argumentos
cursor
O identificador do cursor. cursor é um parâmetro necessário que chama um valor de entrada int . cursor é o valor do identificador gerado pelo SQL Server e retornado pelo procedimento sp_cursoropen.
tipo de operação
É um parâmetro necessário que designa qual operação o cursor executará. optype requer um dos seguintes valores de entrada int .
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 acessadas novamente e excluídas. |
0X0004 | INSERT | Insere dados sem criar uma instrução SQL 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 U-Lock 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 | É usado somente quando o programa vai emitir uma instrução DELETE ou UPDATE posicionada subsequente no SQL Server. |
0X40 | ABSOLUTE | Pode ser usado apenas junto com UPDATE ou DELETE. ABSOLUTE é usado apenas com cursores KEYSET (é ignorado para cursores DYNAMIC e cursores STATIC 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 retornado não poderá ser garantido. |
rownum
Especifica qual das linhas no buffer de busca o cursor irá afetar, atualizar ou excluir.
Observaçã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 necessário que chama 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ção
É válido apenas para uso com valores de optype UPDATE, DELETE, REFRESH ou LOCK.
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 cláusula FROM. table é um parâmetro opcional que requer um valor de entrada String. É possível especificar a cadeia de caracteres 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 string de valor é usado apenas com valores de optype UPDATE e INSERT. É possível especificar a cadeia de caracteres como qualquer tipo de dados de caractere ou UNICODE.
Observação
Os nomes de parâmetro para valor podem ser atribuídos pelo usuário.
Valores do código de retorno
Ao usar um RPC, uma operação DELETE ou UPDATE posicionada com um número de buffer 0 retornará uma mensagem DONE com uma contagem de linhas de 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 do optype 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 optype INSERT é 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 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. Depois que SETPOSITION é executado, a posição permanece em vigor até a próxima operação sp_cursorfetch, operação T-SQL FETCH ou sp_cursor operação SETPOSITION por meio 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 nenhum erro retornado. Uma vez que a posição seja definida, ela permanecerá em vigor até a próxima operação sp_cursorfetch, operação T-SQL ou operação SETPOSITION sp_cursor 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 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 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 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ção
Com relação a exibições, somente uma tabela participante da 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 substituirá o nome da exibição).
Parâmetro value
Há duas alternativas às regras de uso de valor , conforme declarado anteriormente na seção Argumentos:
Você pode usar um nome que seja '@' 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.
Use um parâmetro para enviar uma instrução UPDATE ou INSERT completa ou use vários parâmetros para enviar partes de uma instrução UPDATE ou INSERT que o SQL Server criará em uma instrução completa. Você encontrará exemplos disso na seção Exemplos, posteriormente 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ção
Se o nome> da tabela UPDATE <for especificado, qualquer valor especificado para o parâmetro da 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]
e os parâmetros subsequentes devem estar neste formato:
<column name> = expression [,...n]
Nesse caso, o nome da <tabela na instrução de atualização construída é aquele especificado ou padronizado 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ção
Se o nome> da tabela INSERT <for especificado, qualquer valor especificado para o parâmetro da 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]
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. Nesse caso, o nome> da <tabela na instrução UPDATE construída é aquele especificado ou padronizado pelo parâmetro table.
Observação
É possível enviar um parâmetro como um parâmetro nomeado, isto é, "@VALUES
". Neste caso, nenhum outro parâmetro nomeado pode ser usado.
Confira também
sp_cursoropen (Transact-SQL)
sp_cursorfetch (Transact-SQL)
Procedimentos armazenados do sistema (Transact-SQL)
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários