SQL虽然循环不更新表

问题描述:

我试图做一个循环测试,我有一个表有一个标志,意味着“处理”,如果它是0它没有处理,我需要处理,之后,我需要更新表并更改为0,但它不工作,这里是我使用的代码。SQL虽然循环不更新表

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<[email protected] 

    BEGIN  
    SET @IdProcesso='' 
    SELECT @IdProcesso=IdProcesso FROM #PROCESSOS_PENDENTE WHERE [email protected] 

    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 @[email protected]+1 

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

END 
+4

你并不需要一个循环。一个更新语句将会执行 –

+1

但是它需要搜索表中的很多行,并更新FlgEmProcesso中状态为0的所有人。 –

+2

@ViniciusCano是的,但是这正是数据库引擎为你正确使用SQL所做的。 – jeroenh

试试这个:

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<[email protected] 
BEGIN  
    SET @IdProcesso='' 
    SELECT @IdProcesso=IdProcesso FROM #PROCESSOS_PENDENTE WHERE [email protected] 

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

    SET @[email protected]+1 
END 
+0

我得到了这个错误。 Msg 248,Level 16,State 1,Line 21 varchar值'0319290916100342'的转换溢出了一个int列。 –

+0

我已经更新检查它,最初我认为它INT,但后来意识到它是varchar –

+0

现在它的工作,谢谢 –

停止思考程序上,而不是觉得跟SQL工作时,基于集合的。

你做什么似乎是

  • 来自行选择所有ID与加工= 0到一个临时表
  • 更新的临时表中选择的所有行加工= 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 
+0

OP在更新那些选定行之前想要执行一些操作这就是为什么使用循环 –

+0

是的,我需要执行一些更改之前,我会更新我的问题。 –