Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL while循环不更新表_Sql_Sql Server_Tsql - Fatal编程技术网

SQL while循环不更新表

SQL while循环不更新表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试做一个测试循环,我有一个表,它有一个标志,这意味着处理,如果它是0,它没有被处理,我需要处理,之后我需要更新表并更改为0,但它不工作,这是我正在使用的代码 DECLARE @IdProcesso VARCHAR(20) IF(NOT OBJECT_ID('tempdb..#PROCESSOS_PENDENTE') IS NULL) BEGIN DROP TABLE #PROCESSOS_PENDENTE; EN

我正在尝试做一个测试循环,我有一个表,它有一个标志,这意味着处理,如果它是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
试试这个:

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
试试这个:

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

在使用SQL时,不要按程序思考,而要考虑基于集合的问题

你所做的似乎是

从处理为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

在使用SQL时,不要按程序思考,而要考虑基于集合的问题

你所做的似乎是

从处理为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


你不需要一个循环。一条update语句就可以了,但它需要搜索表中的许多行,并更新FlgEmProcesso中状态为0的所有人。@VINICIUSCA不,是的,但如果您正确使用SQL,db引擎会为您这样做。一定要开始考虑SQL中基于集合的操作,这将为你节省大量的时间和将来的头疼事。将大部分循环留给py、C、java等…OP希望在更新这些选定行之前执行一些操作,这就是为什么要使用requirementYou不需要循环的原因。一条update语句就可以了,但它需要搜索表中的许多行,并更新FlgEmProcesso中状态为0的所有人。@VINICIUSCA不,是的,但如果您正确使用SQL,db引擎会为您这样做。一定要开始考虑SQL中基于集合的操作,这将为你节省大量的时间和将来的头疼事。将大部分循环留给py、C、java等…OP希望在更新这些选定行之前执行一些操作,这就是为什么要使用requirementI中提到的循环我遇到了这个错误。Msg 248,16级,状态1,第21行varchar值'0319290916100342'的转换溢出了一个int列。我已经更新了检查它,最初我认为它是int,但后来意识到它是varcharIt工作的,但是我不太了解IDPROCESS作为RowNo对这一行行的行号进行过度排序。它得到了行号,但我不理解上面的条款。它会按照给定的顺序逐列为数据分配增量行号,在循环之前,尝试通过从PROCESSOS_PENDENTE中选择*来理解,它会让您清楚地认识到这个错误。Msg 248,16级,状态1,第21行varchar值'0319290916100342'的转换溢出了一个int列。我已经更新了检查它,最初我认为它是int,但后来意识到它是varcharIt工作的,但是我不太了解IDPROCESS作为RowNo对这一行行的行号进行过度排序。它得到了行号,但我不理解上面的条款。它会按照给定的顺序逐列为数据分配增量行号,在循环之前尝试通过选择*从PROCESSOS_PENDENTE中理解,它会让您清楚地知道AOP想在更新这些选定行之前执行一些操作,这就是为什么使用loopingYes,我需要在之前执行一些更改,我将更新我的问题。OP希望在更新这些选定行之前执行一些操作,这就是为什么使用loopingYes,我需要在之前执行一些更改,我将更新我的问题。