Vinicius Cano Vinicius Cano - 2 months ago 7
SQL Question

SQL while loop don't update table

I'm trying to make a loop for test,i have a table that has a flag that means "processed" if it's 0 its not processed and i need to process,after that i need to update the table and change to 0,but its not working,here is the code i'm using.

DECLARE
@IdProcesso VARCHAR(20)
IF(NOT OBJECT_ID('tempdb..#PROCESSOS_PENDENTE') IS NULL)
BEGIN
DROP TABLE #PROCESSOS_PENDENTE;
END
SELECT IdProcesso as IdProcesso
INTO #PROCESSOS_PENDENTE
FROM fornecedores.aceite WHERE FlgEmProcesso = 0

--PERCORRE TODOS OS REGISTROS E ENVIA OS EMAILS
WHILE (exists (select IdProcesso from #PROCESSOS_PENDENTE))
BEGIN
UPDATE fornecedores.aceite set FlgEmProcesso = 1
WHERE IdProcesso = @IdProcesso

END





This is the procedure that i'm using,now it Works with the changes it was suggested.

ALTER procedure [Fornecedores].[prConsultaStatusProcesso]
as

DECLARE
@IdProcesso VARCHAR(20),
@Tag SYSNAME,
@IdDoc UNIQUEIDENTIFIER,
@Parans VARCHAR(500)


--TEMP TABLES
IF(NOT OBJECT_ID('tempdb..#PROCESSOS_PENDENTE') IS NULL)
BEGIN
DROP TABLE #PROCESSOS_PENDENTE;
END


--ARMAZENA TODOS OS PROCESSOS PENDENTES
SELECT
IdProcesso as IdProcesso,
ROW_NUMBER() OVER(Order by IdProcesso) AS RowNo
INTO #PROCESSOS_PENDENTE
FROM fornecedores.aceite WHERE FlgEmProcesso = 0

--PERCORRE TODOS OS REGISTROS E ENVIA OS EMAILS
DECLARE @Index INT=1,@TotalCount INT=0
SELECT @TotalCount=COUNT(*) FROM #PROCESSOS_PENDENTE

WHILE @Index<=@TotalCount

BEGIN
SET @IdProcesso=''
SELECT @IdProcesso=IdProcesso FROM #PROCESSOS_PENDENTE WHERE RowNo=@Index

SET @Parans = '<Zfif0004Processo><IEmail></IEmail><IIdProcesso>' + @IdProcesso + '</IIdProcesso></Zfif0004Processo>';

--CONSULTA NO SAP SE O PROCESSO FOI CONCLUIDO COM SUCESSO
--O RETORNO CHAMARA A PROCEDURE
--QUE FICARA RESPONSAVEL EM ENVIAR O EMAIL PARA O FORNECEDOR
EXEC Geral.prAddMsgOnKolQueue
@SourceAppName ='TEXT'
,@TargetAppName ='TEXT'
,@TopicName ='TEXT'
,@Tag = 'TEXT'
,@TextData = @Parans;

--ALTERAR O STATAUS DO PROCESSO PARA "EM PROCESSO"
UPDATE fornecedores.aceite set FlgEmProcesso = 1
WHERE IdProcesso = @IdProcesso

SET @Index=@Index+1

--EXCLUI REGISTRO DA TABELA TEMPORARIA
--DELETE #PROCESSOS_PENDENTE Where IdProcesso = @IdProcesso

END

Answer

Try This:

DECLARE 
    @IdProcesso  VARCHAR(20)
    IF(NOT OBJECT_ID('tempdb..#PROCESSOS_PENDENTE') IS NULL)        
BEGIN        
    DROP TABLE #PROCESSOS_PENDENTE;        
END 

SELECT 
    IdProcesso as IdProcesso,
    ROW_NUMBER() OVER(Order by IdProcesso) AS RowNo
INTO #PROCESSOS_PENDENTE
FROM fornecedores.aceite WHERE FlgEmProcesso = 0

--PERCORRE TODOS OS REGISTROS E ENVIA OS EMAILS
DECLARE @Index INT=1,@TotalCount INT=0
SELECT @TotalCount=COUNT(*) FROM #PROCESSOS_PENDENTE

WHILE @Index<=@TotalCount 
BEGIN       
    SET @IdProcesso=''
    SELECT @IdProcesso=IdProcesso FROM #PROCESSOS_PENDENTE WHERE RowNo=@Index

    UPDATE fornecedores.aceite set FlgEmProcesso = 1
        WHERE IdProcesso = @IdProcesso  

    SET @Index=@Index+1
 END