SQL while循环不更新表
我正在尝试做一个测试循环,我有一个表,它有一个标志,这意味着处理,如果它是0,它没有被处理,我需要处理,之后我需要更新表并更改为0,但它不工作,这是我正在使用的代码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
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,我需要在之前执行一些更改,我将更新我的问题。