Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

JSantanna

Error Cursor no SQL Server 2012

Recommended Posts

Boa tarde,


Estou com problema com cursor. Quando executo com SELECT TOP 10000, executa sem erro, porém quando tento executar direto ocorre o erro


"Could not complete cursor operation because the table schema changed after the cursor was declared."



Alguém tem alguma ideia?



Obrigado !


Segue codigo:



DECLARE @ID INT, @CNPJ VARCHAR(8), @RETORNO VARCHAR(MAX)



DECLARE cursorSerasaDet CURSOR LOCAL FOR



SELECT ID_PESQUISA, CNPJ, RETORNO FROM db_financeiro.dbo.TB_SERASA_PESQUISA (NOLOCK)


WHERE


(


RETORNO LIKE '%L040102%'


/* RETORNO LIKE '%L040201%' OR


RETORNO LIKE '%L040301%' OR


RETORNO LIKE '%L040401%' OR


RETORNO LIKE '%L040501%' OR


RETORNO LIKE '%L040601%' OR


RETORNO LIKE '%L040701%' OR


RETORNO LIKE '%L040801%' OR


RETORNO LIKE '%L040901%' OR


RETORNO LIKE '%L041001%' OR


RETORNO LIKE '%L041101%'*/


)


AND RETORNO NOT LIKE '#INI%'


OPEN cursorSerasaDet



FETCH NEXT FROM cursorSerasaDet INTO @ID, @CNPJ, @RETORNO



WHILE @@FETCH_STATUS = 0



BEGIN



EXECUTE db_financeiro.dbo.PC_RELATO_ATUAL_2 @CNPJ, @ID, @RETORNO;



EXECUTE db_financeiro.dbo.PC_RELATO_HISTORICO_2 @CNPJ, @ID, @RETORNO;




FETCH NEXT FROM cursorSerasaDet INTO @ID, @CNPJ, @RETORNO;


END


CLOSE cursorSerasaDet



DEALLOCATE cursorSerasaDet


Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

Segue solução:

 

Se houve alguma alteração na estrutura da tabela após os testes iniciais, uma possibilidade é que o plano de execução (em cache) do teste anterior seja a causa. Há como forçar a recompilação dos planos de execução que utilizam essa tabela:
EXEC sp_recompile 'object'
onde object é o nome da tabela. Vide detalhes na documentação de sp_recompile.


Independente desse fato, e considerando-se o código-fonte que transcreveu para este tópico, sugiro que altere a declaração do cursor para FAST_FORWARD:

DECLARE cursorSerasaDet CURSOR LOCAL FAST_FORWARD FOR

Compartilhar este post


Link para o post
Compartilhar em outros sites

O sp_recompile funciona em procedures, portanto vc pode ter um problema tb de parameter sniffing.

 

Pra isso nao ocorrer(cache), eu trocaria este CURSOR por um While:

http://adjuniordba.wordpress.com/2013/07/04/while-para-cursores/

 

Melhora significantemente a performance.

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.