2016-09-29 81 views
1

我試圖做一個循環測試,我有一個表有一個標誌,意味着「處理」,如果它是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

回答

2

試試這個:

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

現在它的工作,謝謝 –

4

停止思考程序上,而不是覺得跟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

是的,我需要執行一些更改之前,我會更新我的問題。 –