SQL while循环不更新表

时间:2016-09-29 13:56:33

标签: sql sql-server tsql

我正在尝试为测试做一个循环,我有一个表有一个标志意味着“已处理”,如果它是0它未处理我需要处理,之后我需要更新表并更改为0,但它不起作用,这是我正在使用的代码。

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

这是我正在使用的程序,现在它适用于建议的更改。

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

2 个答案:

答案 0 :(得分:4)

不要在程序上思考,而是在使用SQL时考虑基于集合。

你做的似乎是

  • 从Processed = 0的行中选择所有ID到临时表
  • 将临时表中选择的所有行更新为Processed = 1

你可以在没有像这样的while循环的情况下实现这个目的:

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

UPDATE fornecedores.aceite set FlgEmProcesso = 1
FROM fornecedores.aceite
JOIN #PROCESSOS_PENDENTE on #PROCESSOS_PENDENTE.IdProcesso = fornecedores.aceite.IdProcesso

答案 1 :(得分:2)

试试这个:

userinteraction