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 RELATIVE
operaçã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 UPDATE
valores , 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
, DELETE
os valores de SETPOSITION
optype são mutuamente exclusivos. REFRESH
DELETE
UPDATE
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 nenhumaRELATIVE
operação ,NEXT
, ouPREVIOUS
fetch, nem nenhuma atualização ou exclusão executada usando asp_cursor
interface. Qualquer número que não especifique uma linha no buffer de busca resulta na configuração da posição como1
, sem que nenhum erro seja retornado. DepoisSETPOSITION
de executada, a posição permanece em vigor até a próximasp_cursorfetch
operação, operação T-SQLFETCH
ousp_cursor
SETPOSITION
operação por meio do mesmo cursor. Uma operação subsequentesp_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 umaOR
cláusula comREFRESH
,UPDATE
,DELETE
, ouLOCK
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:
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.Use um parâmetro para enviar uma instrução or
INSERT
completaUPDATE
ou use vários parâmetros para enviar partes de umaUPDATE
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.