sp_cursoropen (Transact-SQL)
Aplica-se a:SQL Server
Abre um cursor. sp_cursoropen define a instrução SQL associada às opções de cursor e cursor e, em seguida, preenche o cursor. sp_cursoropen é equivalente à combinação das instruções Transact-SQL DECLARE_CURSOR e OPEN. Esse procedimento é invocado pela especificação de ID = 2 em um pacote TDS.
Convenções de sintaxe de Transact-SQL
Sintaxe
sp_cursoropen cursor OUTPUT, stmt
[, scrollopt[ OUTPUT ] [ , ccopt[ OUTPUT ]
[ ,rowcount OUTPUT [ ,boundparam][,...n]]] ]]
Argumentos
cursor
Um identificador de cursor gerado pelo SQL Server. cursor é um valor de identificador que deve ser fornecido em todos os procedimentos subsequentes envolvendo o cursor, como sp_cursorfetch. cursor é um parâmetro obrigatório com um valor de retorno int .
O cursor permite que vários cursores estejam ativos em uma única conexão de banco de dados.
STMT
É um parâmetro obrigatório que define o conjunto de resultados do cursor. Qualquer cadeia de caracteres de consulta válida (sintaxe e associação) de qualquer tipo de cadeia de caracteres (independentemente de Unicode, tamanho, etc.) pode servir como um tipo de valor stmt válido.
scrollopt
Opção de rolagem. scrollopt é um parâmetro opcional que requer um dos seguintes valores de entrada int .
Valor | Descrição |
---|---|
0x0001 | KEYSET |
0x0002 | DYNAMIC |
0x0004 | FORWARD_ONLY |
0x0008 | STATIC |
0x10 | FAST_FORWARD |
0x1000 | PARAMETERIZED_STMT |
0x2000 | AUTO_FETCH |
0x4000 | AUTO_CLOSE |
0x8000 | CHECK_ACCEPTED_TYPES |
0x10000 | KEYSET_ACCEPTABLE |
0x20000 | DYNAMIC_ACCEPTABLE |
0x40000 | FORWARD_ONLY_ACCEPTABLE |
0x80000 | STATIC_ACCEPTABLE |
0x100000 | FAST_FORWARD_ACCEPTABLE |
Devido à possibilidade de que o valor solicitado não seja apropriado para o cursor definido por stmt, esse parâmetro serve como entrada e saída. Nesses casos, o SQL Server atribui um valor apropriado.
CCOPT
Opção de controle de simultaneidade. CCOPT é um parâmetro opcional que requer um dos seguintes valores de entrada int .
Valor | Descrição |
---|---|
0x0001 | READ_ONLY |
0x0002 | SCROLL_LOCKS (anteriormente conhecido como LOCKCC) |
0x0004 | OTIMISTA (anteriormente conhecido como OPTCC) |
0x0008 | OPTIMISTIC (anteriormente conhecido como OPTCCVAL) |
0x2000 | ALLOW_DIRECT |
0x4000 | UPDT_IN_PLACE |
0x8000 | CHECK_ACCEPTED_OPTS |
0x10000 | READ_ONLY_ACCEPTABLE |
0x20000 | SCROLL_LOCKS_ACCEPTABLE |
0x40000 | OPTIMISTIC_ACCEPTABLE |
0x80000 | OPTIMISITC_ACCEPTABLE |
Assim como acontece com scrollopt, o SQL Server pode substituir os valores ccopt solicitados.
contagem de linhas
O número de linhas do buffer de busca a serem usadas com AUTO_FETCH. O padrão é 20 linhas. rowcount se comporta de forma diferente quando atribuído como um valor de entrada versus um valor de retorno.
Como valor de entrada | Como valor de retorno |
---|---|
Quando o valor AUTO_FETCH scrollopt é especificado , a contagem de linhas representa o número de linhas a serem colocadas no buffer de busca. Nota: >0 é um valor válido quando AUTO_FETCH é especificado, mas é ignorado. |
Representa o número de linhas no conjunto de resultados, exceto quando o valor de AUTO_FETCH scrollopt é especificado. |
-
boundparam
Significa o uso de parâmetros adicionais. boundparam é um parâmetro opcional que deve ser especificado se o valor de PARAMETERIZED_STMT scrollopt estiver definido como ON.
Valores do código de retorno
Se nenhum erro ocorrer, sp_cursoropen retornará um dos valores a seguir.
0
O procedimento foi executado com êxito.
0x0001
Ocorreu um erro durante a execução (um erro secundário, não grave o bastante para gerar um erro na operação).
0x0002
Uma operação síncrona está em andamento.
0x0002
Uma operação FETCH está em andamento.
Um
Esse cursor foi desalocado pelo SQL Server e não está disponível.
Quando um erro ocorrer, os valores de retorno poderão estar inconsistentes e a exatidão não pode ser garantida.
Quando o parâmetro rowcount é especificado como um valor de retorno, ocorre o seguinte conjunto de resultados.
-1
Retornado se o número de linhas for desconhecido ou não aplicável.
-n
Retornado quando uma população assíncrona está em vigor. Representa o número de linhas que foram colocadas no buffer de busca quando o valor de AUTO_FETCH scrollopt é especificado.
Se o RPC estiver em uso, os valores de retorno serão como se segue.
0
Procedimento bem-sucedido.
1
Falha no procedimento.
2
Um cursor de conjunto de chaves está sendo gerado de forma assíncrona.
16
Um cursor de avanço foi fechado automaticamente.
Observação
Se o procedimento sp_cursoropen for executado com êxito, os parâmetros de retorno RPC e um conjunto de resultados com informações de formato de coluna TDS (0xa0 & 0xa1 mensagens) serão enviados. Caso contrário, uma ou mais mensagens de erro TDS serão enviadas. Em ambos os casos, nenhum dado de linha será retornado e a contagem de mensagens concluída será zero. Se você estiver usando uma versão do SQL Server anterior à 7.0, 0xa0, 0xa1 (padrão para instruções SELECT) serão retornadas junto com 0xa5 e 0xa4 fluxos de token. Se você estiver usando o SQL Server 7.0, 0x81 é retornado (padrão para instruções SELECT) junto com os fluxos de token 0xa5 e 0xa4.
Comentários
Parâmetro stmt
Se stmt especificar a execução de um procedimento armazenado, os parâmetros de entrada poderão ser definidos como constantes como parte da cadeia de caracteres stmt ou especificados como argumentos boundparam. Variáveis declaradas podem ser passadas como parâmetros associados dessa forma.
O conteúdo permitido do parâmetro stmt depende se o valor de retorno ccopt ALLOW_DIRECT foi ou não vinculado por OR ao restante dos valores ccopt, ou seja:
Se ALLOW_DIRECT não for especificado, uma instrução Transact-SQL SELECT ou EXECUTE chamando um procedimento armazenado contendo uma única instrução SELECT deverá ser usada. Além disso, a instrução SELECT deve se qualificar como um cursor; ou seja, não pode conter as palavras-chave SELECT INTO ou FOR BROWSE.
Se ALLOW_DIRECT for especificado, isso poderá resultar em uma ou mais instruções Transact-SQL, incluindo aquelas que, por sua vez, executam outros procedimentos armazenados com várias instruções. As instruções diferentes de SELECT ou qualquer instrução SELECT que contenha as palavras-chave SELECT INTO ou FOR BROWSE serão simplesmente executadas e não resultarão na criação de um cursor. O mesmo ocorre para qualquer instrução SELECT incluída em um lote de várias instruções. Nos casos em que uma instrução SELECT contém cláusulas que só pertencem a cursores, essas cláusulas são ignoradas. Por exemplo, quando o valor de ccopt é 0x2002, este é um pedido para:
Um cursor com bloqueios de rolagem, se houver somente uma única instrução SELECT qualificada como um cursor, ou
Uma execução de instrução direta se houver várias instruções, uma única instrução não SELECT ou uma instrução SELECT que não esteja qualificada como um cursor.
Parâmetro scrollopt
Os cinco primeiros valores scrollopt (KEYSEY, DYNAMIC, FORWARD_ONLY, STATIC e FAST_FORWARD) são mutuamente exclusivos.
PARAMETERIZED_STMT e CHECK_ACCEPTED_TYPES podem ser vinculados por OR a qualquer um dos cinco primeiros valores.
AUTO_FETCH e AUTO_CLOSE podem ser vinculados por OR a FAST_FORWARD.
Se CHECK_ACCEPTED_TYPES estiver ON, pelo menos um dos últimos cinco valores scrollopt (KEYSET_ACCEPTABLE,
DYNAMIC_ACCEPTABLE, FORWARD_ONLY_ACCEPTABLE, STATIC_ACCEPTABLE ou FAST_FORWARD_ACCEPTABLE) também deverá estar ON.
Os cursores STATIC são sempre abertos como READ_ONLY. Isso significa que a tabela subjacente não pode ser atualizada por meio desse cursor.
Parâmetro ccopt
Os quatro primeiros valores ccopt (READ_ONLY, SCROLL_LOCKS e ambos os valores OPTIMISTIC) são mutuamente exclusivos.
Observação
A escolha de um dos quatro primeiros valores ccopt determina se o cursor é somente leitura ou se métodos de bloqueio ou otimistas são usados para evitar atualizações perdidas. Se um valor ccopt não for especificado, o valor padrão será OPTIMISTIC.
ALLOW_DIRECT e CHECK_ACCEPTED_TYPES podem ser vinculados por OR a qualquer um dos quatro primeiros valores.
UPDT_IN_PLACE pode ser vinculado por OR a READ_ONLY, SCROLL_LOCKS ou qualquer um dos valores OPTIMISTIC.
Se CHECK_ACCEPTED_TYPES estiver ON, pelo menos um dos últimos quatro valores ccopt (READ_ONLY_ACCEPTABLE, SCROLL_LOCKS_ACCEPTABLE e qualquer um dos valores OPTIMISTIC_ACCEPTABLE) também deve ser ON.
As funções UPDATE e DELETE posicionadas podem ser executadas somente dentro do buffer de busca e somente se o valor ccopt for igual a SCROLL_LOCKS ou OPTIMISTIC. Se SCROLL_LOCKS for o valor especificado, a operação terá êxito garantido. Se OPTIMISTIC for o valor especificado, a operação falhará se a linha tiver sido alterada desde que foi buscada pela última vez.
A razão para essa falha é que, quando OPTIMISTIC é o valor especificado, uma função de controle de moeda otimista é executada comparando carimbos de data/hora ou valores de soma de verificação, conforme determinado pelo SQL Server. Se qualquer uma dessas linhas não corresponder, a operação falhará.
A especificação de UPDT_IN_PLACE como o valor de retorno controla os seguintes resultados:
Se não estiver definido durante a execução de uma atualização posicionada em uma tabela com um índice exclusivo, o cursor excluirá a linha de sua tabela de trabalho e a inserirá ao final de qualquer uma das colunas de chave usadas pelo cursor, alterando assim essas colunas.
Se estiver definido como ON, o cursor simplesmente atualizará as colunas de chave na linha original da tabela de trabalho.
Parâmetro bound_param
O nome do parâmetro deve ser paramdef quando PARAMETERIZED_STMT é especificado, de acordo com a mensagem de erro no código. Quando PARAMETERIZED_STMT não é especificado, nenhum nome é especificado na mensagem de erro.
Considerações sobre RPC:
O sinalizador de entrada RPC RETURN_METADATA pode ser definido como 0x0001 para solicitar que os metadados da lista de seleção de cursor sejam retornados no fluxo TDS.
Exemplos
Parâmetro bound_param
Quaisquer parâmetros após o quinto são passados para o plano de instrução como parâmetros de entrada. O primeiro desses parâmetros deve ser uma cadeia de caracteres neste formato:
{ tipo de dados de nome de variável local } [,... n]
Os parâmetros subsequentes são usados para passar os valores a serem substituídos pelo nome da variável local na instrução.
Confira também
sp_cursorfetch (Transact-SQL)
Procedimentos armazenados do sistema (Transact-SQL)
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de