PROBLEMA: Consecutivamente declarando cursores aninhados imediatamente retorna um valor FETCH_STATUS -1

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 325187
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Se você declarar um cursor imediatamente após a declaração de outro cursor no início de um procedimento e, em seguida, executar os cursores em um loop aninhado, isso retorna um valor @@ FETCH_STATUS de – 1.
Causa
Esse comportamento ocorre porque cursores aninhados no SQL Server 7.0 e posterior, não têm valores atualizados do cursor externo.

Considere o exemplo a seguir:
use pubs go create proc nik_tst1 as declare @w_title varchar(10) declare @w_au_id varchar(25) declare titl_cur cursor for select title_id from titles order by title_id declare ta_cur cursor for select au_id from titleauthor where title_id = @w_titleopen  titl_cur fetch titl_cur into @w_title while (@@fetch_status = 0 )Begin 	select @w_title 	open ta_cur 	fetch ta_cur into @w_au_id	select @@fetch_status /* @@FETCH_STATUS value of nested cursor returns -1 when nested cursor is declared before outer cursor's fetch */ 	while (@@fetch_status = 0 )	Begin		select @w_au_id 		select @w_title, @w_au_id 		fetch ta_cur into @w_au_id 	End	close ta_cur 	fetch titl_cur into @w_title End deallocate  ta_cur close titl_cur deallocate titl_cur go exec nik_tst1 go
neste exemplo o valor inicial de @ w_title é NULL quando você declara o cursor aninhado. Portanto, cada execução da instrução SELECT aninhada cursor avalia o valor de @ w_title para NULL. Como resultado, o valor de @@ FETCH_STATUS de um cursor aninhado sempre retorna – 1.
Como Contornar
Para contornar esse problema, declare cursores aninhados no loop WHILE do cursor externo.

Considere o exemplo a seguir:
use pubs go create proc nik_tst2 as declare @w_title varchar(10)declare @w_au_id varchar(25) declare titl_cur cursor for select title_id from titles order by title_id open  titl_cur fetch titl_cur into @w_title while (@@fetch_status = 0 )Begin  	declare ta_cur cursor for select au_id from titleauthor where title_id = @w_title	select @w_title 	open ta_cur 	fetch ta_cur into @w_au_id	select @@fetch_status /* @@FETCH_STATUS value of nested cursor returns 0 when nested cursor is declared in the outer cursor's fetch loop*/ 	while (@@fetch_status = 0 )	Begin		select @w_au_id 		select @w_title, @w_au_id 		fetch ta_cur into @w_au_id 	End	close ta_cur  	deallocate  ta_cur 	fetch titl_cur into @w_title End close titl_cur deallocate titl_cur go exec nik_tst2 go
neste exemplo, você declara o cursor interno no loop WHILE do cursor externo. Portanto, a instrução SELECT do cursor interno usa o valor atualizado de w_title @, e armazena os dados no cursor. Como resultado, FETCH_STATUS @@ do cursor interno retorna 0.
Referências
Para obter mais informações sobre o uso de cursores aninhados, visite o seguinte site:

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 325187 - Última Revisão: 12/07/2015 11:38:44 - Revisão: 5.4

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition

  • kbnosurvey kbarchive kbmt kbstoredproc kbcursor kbprb KB325187 KbMtpt
Comentários