Ir para conteúdo

Arquivado

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

leobehavior

SQL Server message 16924

Recommended Posts

Boa tarde,

Estou efetuando esse código e já verifiquei todas as linhas selecionadas, estão idênticas ao Fetch Next into, não estou conseguindo achar o erro. Alguém poderia me ajudar. A mensagem de erro que da no banco é esse:

SQL Server message 16924: Busca do cursor: o número de variáveis declaradas na lista INTO deve corresponder ao número de colunas selecionadas.

Desde já agradeço.

DECLARE @CODSET FLOAT, @CODPLA FLOAT,@CODCLI FLOAT,@MES FLOAT, @ANO FLOAT, @AUX FLOAT,@CONTROLE FLOAT
DECLARE @TABELA1 TABLE(CODSET FLOAT,CODPLA FLOAT,CODCLI FLOAT, MES FLOAT, ANO FLOAT)
DECLARE EXECUCAO CURSOR FOR
SELECT ORDSERV.CODSET CODSET,
ORDSERV.CODPLA CODPLA,
ORDSERV.CODCLI CODCLI,
DATEPART(MM, ORDSERV.DATPRO2) MES,
DATEPART(YYYY, ORDSERV.DATPRO2) ANO
FROM ORDSERV
LEFT JOIN LOCAPLIC ON ORDSERV.CODEMP_6=LOCAPLIC.CODEMP AND ORDSERV.CODLOCAPL=LOCAPLIC.CODLOCAPL
LEFT JOIN CLIENTE ON ORDSERV.CODCLI=CLIENTE.CODCLI INNER JOIN FILIAL ON ORDSERV.CODEMP_7=FILIAL.CODEMP AND ORDSERV.CODFIL=FILIAL.CODFIL
INNER JOIN APLIC ON ORDSERV.CODAPL=APLIC.CODAPL
INNER JOIN TIPAPLIC ON APLIC.CODEMP_2=TIPAPLIC.CODEMP AND APLIC.CODTIPAPL=TIPAPLIC.CODTIPAPL
LEFT JOIN PLAMANUT ON ORDSERV.CODEMP_1=PLAMANUT.CODEMP AND ORDSERV.CODPLA=PLAMANUT.CODPLA
INNER JOIN SETEXE ON ORDSERV.CODEMP_4=SETEXE.CODEMP AND ORDSERV.CODSET=SETEXE.CODSET
INNER JOIN TIPMANUT ON ORDSERV.CODEMP_2=TIPMANUT.CODEMP AND ORDSERV.CODTIPMAN=TIPMANUT.CODTIPMAN
WHERE ORDSERV.DATPRO2 BETWEEN CONVERT(DATETIME,'01/10/2016',103)
AND CONVERT(DATETIME,'31/10/2016',103)
AND ORDSERV.CODEMP = 76
AND ORDSERV.CODSET = @CODSET
AND 1=(CASE WHEN @CODPLA = 0 AND ORDSERV.CODPLA IS NULL
THEN 1
ELSE CASE WHEN ORDSERV.CODPLA = @CODPLA
THEN 1
ELSE 0
END
END)
AND DATEPART(MM, ORDSERV.DATPRO2) = @MES
AND DATEPART(YYYY, ORDSERV.DATPRO2) =@ANO
AND 1=CASE WHEN @CODCLI = 0 AND ORDSERV.CODCLI IS NULL
THEN 1
ELSE CASE WHEN ORDSERV.CODCLI = @CODCLI
THEN 1
ELSE 0
END
END
ORDER BY 1,2,3
OPEN EXECUCAO
FETCH NEXT FROM EXECUCAO INTO @CODSET, @CODPLA,@CODCLI,@MES, @ANO
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT INTO @TABELA1 (CODSET,CODPLA,CODCLI,MES,ANO) VALUES (@CODSET, @CODPLA,@CODCLI,@MES, @ANO)
SET @AUX=1
SET @CONTROLE = 1
END
CLOSE EXECUCAO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem somente este cursor na sintaxe?

Poder ser o tipo de campo,

Faça um teste rapido. Ao invés de dar um insert, de um select nas variaveis e veja o retorno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Leo! tranquilão?

1 - quando for fazer um cursor de um select monstrão assim, cheio de joins, jogue o resultado para uma tabela temporária e faça o cursor(ou um loop com while) nessa tabela... desse jeito ai, a cada volta do cursor ele vai executar essa parada.

2 - Ta faltando um "fetch next" dentro do while, pra passar pra próxima linha, copie o que ta logo após open e coloque antes do "end" do while... a falta desse cara pode jogar seu cursor em um looping infinito.

3 - Vi rápido mas não notei possível causa pra esse problema, numero de colunas selecionadas está batendo com o fetch next, faça essas duas adequações ai (pra ficar mais limpo e fácil de analisar, já que n da pra testar aqui).

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Diemerson,

Obrigadão pela atenção. Coloquei o "fetch next" dentro do while como me sugeriu e o deallocate no final, executou e não veio resultado nenhum e nenhuma mensagem também. Coloquei assim a abertura do cursor:

OPEN EXECUCAO
FETCH NEXT FROM EXECUCAO INTO @CODSET, @CODPLA,@CODCLI,@MES, @ANO
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @TABELA1 (CODSET,CODPLA,CODCLI,MES,ANO) VALUES (@CODSET, @CODPLA,@CODCLI,@MES, @ANO)
SET @AUX=1
SET @CONTROLE = 1
FETCH NEXT FROM EXECUCAO INTO @CODSET, @CODPLA,@CODCLI,@MES, @ANO
END
CLOSE EXECUCAO
DEALLOCATE EXECUCAO;

Compartilhar este post


Link para o post
Compartilhar em outros sites

consegue mudar para um while?

Segue um exemplo:

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Leo! bom?

Veja se no início do script tem algo como "set nocount on" talvez ele esteja impedindo as mensagens que provavelmente seriam algo do tipo "(1 row(s) affected)" seriam o único resultado desse cursor que postou. o erro deixou de ocorrer?

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.