sp_cursorfetch (Transact-SQL)
Aplica-se: SQL Server
Busca um buffer de uma ou mais linhas no banco de dados. O grupo de linhas nesse buffer é chamado de buffer de busca do cursor. sp_cursorfetch
é invocado especificando ID = 7
em um pacote TDS (fluxo de dados tabulares).
Convenções de sintaxe de Transact-SQL
Sintaxe
sp_cursorfetch cursor
[ , fetchtype [ , rownum [ , nrows ] ] ]
[ ; ]
Argumentos
cursor
Um valor de identificador gerado pelo SQL Server e retornado por sp_cursoropen
. cursor é um parâmetro necessário que chama um valor de entrada int . Para obter mais informações, consulte a seção Comentários.
tipo de busca
Especifica o buffer de cursor a ser buscado. fetchType é um parâmetro opcional que requer um dos seguintes valores de entrada inteiros.
Valor | Nome | Descrição |
---|---|---|
0x0001 |
FIRST |
Busca o primeiro buffer de linhas nrows . Se nrows for igual a 0, o cursor será posicionado antes do conjunto de resultados e nenhuma linha será retornada. |
0x0002 |
NEXT |
Busca o próximo buffer de linhas nrows . |
0x0004 |
PREV |
Busca o buffer anterior de linhas nrows . Observação: Usar PREV para um FORWARD_ONLY cursor retorna uma mensagem de erro porque FORWARD_ONLY suporta apenas a rolagem em uma direção. |
0x0008 |
LAST |
Busca o último buffer de linhas nrows . Se nrows for igual a 0, o cursor será posicionado após o conjunto de resultados e nenhuma linha será retornada. Observação: Usar LAST para um FORWARD_ONLY cursor retorna uma mensagem de erro porque FORWARD_ONLY suporta apenas a rolagem em uma direção. |
0x10 |
ABSOLUTE |
Busca um buffer de nrows rows começando com rownum row. Observação: Usar ABSOLUTE para um DYNAMIC cursor ou um FORWARD_ONLY cursor retorna uma mensagem de erro porque FORWARD_ONLY suporta apenas a rolagem em uma direção. |
0x20 |
RELATIVE |
Busca o buffer de linhas nrows começando com a linha especificada como sendo o valor rownum das linhas da primeira linha no bloco atual. Nesse caso, rownum pode ser um número negativo. Observação: Usar RELATIVE para um FORWARD_ONLY cursor retorna uma mensagem de erro porque FORWARD_ONLY suporta apenas a rolagem em uma direção. |
0x80 |
REFRESH |
Torna a encher o buffer a partir de tabelas subjacentes. |
0x100 |
INFO |
Recupera informações sobre o cursor. Essas informações são retornadas usando os parâmetros rownum e nrows . Portanto, quando INFO é especificado, rownum e nrows se tornam parâmetros de saída. |
0x200 |
PREV_NOADJUST |
É usado como PREV . Porém, se a parte superior do conjunto de resultados for encontrada prematuramente, os resultados poderão variar. |
0x400 |
SKIP_UPDT_CNCY |
Deve ser usado com um dos outros valores fetchtype , exceto para INFO . |
Observação
Não há suporte para o valor 0x40
.
Para obter mais informações, consulte a seção Comentários.
rownum
Um parâmetro opcional usado para especificar a posição da linha para os ABSOLUTE
valores e INFO
fetchtype usando apenas valores inteiros para entrada ou saída, ou ambos. rownum serve como o deslocamento de linha para o valor RELATIVE
de bit fetchtype . rownum é ignorado para todos os outros valores. Para obter mais informações, consulte a seção Comentários.
nrows
Um parâmetro opcional que é usado para especificar o número de linhas a serem buscadas. Se nrows não for especificado, o valor padrão será 20 linhas. Para definir a posição sem retornar dados, especifique um valor de 0
. Quando nrows é aplicado à consulta fetchtypeINFO
, ele retorna o número total de linhas nessa consulta.
nrows é ignorado pelo valor de bit fetchtypeREFRESH
. Para obter mais informações, consulte a seção Comentários.
Valores do código de retorno
Quando você especifica o valor INFO
do bit , os valores que podem ser retornados são mostrados nas tabelas a seguir.
Se nenhuma linha for retornada, o conteúdo do buffer permanecerá como estava.
<rownum> | Definir como |
---|---|
Se não abrir | 0 |
Se posicionado antes do conjunto de resultados | 0 |
Se posicionado após o conjunto de resultados | -1 |
Para KEYSET e STATIC cursores |
O número de linha absoluto da posição atual no conjunto de resultados |
Para DYNAMIC cursores |
1 |
Para ABSOLUTE |
-1 retorna a última linha de um conjunto. -2 retorna da segunda à última linha de um conjunto, e assim por diante. Nota: Se mais de uma linha for solicitada para busca neste caso, as duas últimas linhas do conjunto de resultados serão retornadas. |
<nrows> |
Definir como |
---|---|
Se não abrir | 0 |
Para KEYSET e STATIC cursores |
Normalmente, o tamanho do conjunto de chaves atual.-m se o cursor estiver em criação assíncrona com m linhas encontradas até este ponto. |
Para DYNAMIC cursores |
-1 |
Comentários
O parâmetro cursor
Antes de qualquer operação de busca, a posição padrão de um cursor é antes da primeira linha do conjunto de resultados.
O parâmetro fetchtype
Exceto por SKIP_UPD_CNCY
, os valores fetchtype são mutuamente exclusivos.
Quando SKIP_UPDT_CNCY
é especificado, os valores da coluna de carimbo de data/hora não são gravados na tabela do conjunto de chaves quando uma linha é buscada ou atualizada. Se a linha de conjunto de chaves estiver sendo atualizada, os valores das colunas de carimbo de data/hora permanecerão como o valor anterior. Se a linha de conjunto de linhas estiver sendo inserida, os valores das colunas de carimbo de data/hora serão indefinidos.
Para KEYSET
cursores, isso significa que a tabela de conjunto de chaves tem os valores definidos durante o último nonskip FETCH
, se um foi executado. Caso contrário, são os valores definidos durante a população.
Para DYNAMIC
cursores, isso significa que, se o salto for executado com uma atualização, ele produzirá os mesmos resultados que KEYSET
. Para qualquer outro tipo de busca, uma tabela de conjuntos de chaves truncada. Isso significa que as linhas estão sendo inseridas e os valores das colunas de carimbo de data/hora são indefinidos. Portanto, ao executar sp_cursorfetch
DYNAMIC
cursores, evite usar SKIP_UPDT_CNCY
para qualquer operação diferente de REFRESH
.
Se uma operação de busca falhar porque a posição do cursor solicitado está além do conjunto de resultados, a posição do cursor será definida para logo após a última linha. Se uma operação de busca falhar porque a posição do cursor solicitado está antes do conjunto de resultados, a posição do cursor será definida para antes da primeira linha.
O parâmetro rownum
Quando você usa rownum, o buffer é preenchido começando com a linha especificada.
O valor ABSOLUTE
fetchtype refere-se à posição de rownum dentro de todo o conjunto de resultados. Um número negativo com ABSOLUTE
especifica que a operação conta linhas a partir do final do conjunto de resultados.
O valor RELATIVE
fetchtype refere-se à posição de rownum em relação à posição do cursor no início do buffer atual. Um número negativo com RELATIVE
especifica que o cursor retrocede a partir da posição atual do cursor.
O parâmetro nrows
Os valores REFRESH
fetchtype e INFO
ignorar esse parâmetro.
Quando você especifica um valor fetchtype de FIRST
que é um valor nrow de 0, o cursor é posicionado antes do conjunto de resultados que não há linhas no buffer de busca.
Quando você especifica um valor fetchtype de que é um valor nrow de 0, o cursor é posicionado após o conjunto de LAST
resultados que não há linhas no buffer de busca atual.
Para os valores fetchtype de NEXT
, PREV
, ABSOLUTE
, RELATIVE
e PREV_NOADJUST
, um valor nrow de 0
não é válido.
Considerações sobre RPC
O status de retorno RPC indica se o parâmetro de tamanho do conjunto de chaves é final ou não; ou seja, se o conjunto de chaves ou a tabela temporária estiver sendo preenchido de forma assíncrona.
O parâmetro de status RPC é definido como um dos valores mostrados na tabela a seguir.
Valor | Descrição |
---|---|
0 |
Procedimento executado com êxito. |
0x0001 |
Falha no procedimento. |
0x0002 |
Uma busca em uma direção negativa fez com que a posição do cursor fosse definida no início do conjunto de resultados, quando a busca logicamente teria sido antes dos resultados. |
0x10 |
Um cursor de avanço rápido foi fechado automaticamente. |
As linhas são retornadas como um conjunto de resultados típico: formato de coluna (0x2a
), linhas (0xd1
), seguidas por DONE
(0xfd
). Os tokens de metadados são enviados no mesmo formato especificado para sp_cursoropen
: 0x81
, 0xa5
e 0xa4
para usuários do SQL Server e assim por diante. Os indicadores de status da linha são enviados como colunas ocultas, semelhantes ao BROWSE
modo, no final de cada linha com o nome da coluna rowstat e o tipo de dados int. Essa coluna rowstat tem um dos valores mostrados na tabela a seguir.
Valor | Descrição |
---|---|
0x0001 |
FETCH_SUCCEEDED |
0x0002 |
FETCH_MISSING |
Como o protocolo TDS não fornece nenhuma maneira de enviar a coluna de status à direita sem enviar as colunas anteriores, os dados fictícios são enviados para linhas ausentes. Os campos anuláveis são definidos como nulos e os campos de comprimento fixo são definidos como 0
, em branco ou o padrão para essa coluna, conforme apropriado.
A DONE
contagem de linhas é sempre 0
. A DONE
mensagem contém a contagem de linhas do conjunto de resultados real e mensagens de erro ou informativas podem aparecer entre qualquer mensagem TDS.
Para solicitar que os metadados sobre a lista de seleção do cursor sejam retornados no fluxo TDS, defina o sinalizador de entrada RPC RETURN_METADATA
como 1
.
Exemplos
R. Use PREV para alterar a posição do cursor
Suponha que um cursor h2 gerasse um conjunto de resultados com o conteúdo a seguir com uma posição atual conforme é mostrado:
row 1 contents
row 2 contents
row 3 contents
row 4 contents <-- current position
row 5 contents
row 6 contents
Em seguida, um sp_cursorfetch
PREV
where nrows is 5
posicionaria logicamente o cursor duas linhas antes da primeira linha do conjunto de resultados. Nesses casos, o cursor é ajustado para iniciar na primeira linha e retornar o número de linhas solicitado. Isso frequentemente significa que ele retorna linhas que estavam no PRIOR
buffer de busca.
Observação
Esse é o caso exato em que o parâmetro de status RPC é definido como 2.
B. Use PREV_NOADJUST para retornar menos linhas do que PREV
PREV_NOADJUST
Nunca inclui nenhuma das linhas na posição atual do cursor ou após ela no bloco de linhas que ele retorna. Nos casos em que PREV
retorna linhas após a posição atual, PREV_NOADJUST
retorna menos linhas do que o solicitado em nrows. Dada a posição atual no Exemplo A anteriormente, quando PREV
é aplicado, sp_cursorfetch (h2, 4, 1, 5)
busca as seguintes linhas:
row1 contents
row2 contents
row3 contents
row4 contents
row5 contents
No entanto, quando PREV_NOADJUST
é aplicado, sp_cursorfetch (h2, 512, 6, 5)
busca apenas as seguintes linhas:
row1 contents
row2 contents
row3 contents