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
试试这个:
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
我得到了这个错误。 Msg 248,Level 16,State 1,Line 21 varchar值'0319290916100342'的转换溢出了一个int列。 –
我已经更新检查它,最初我认为它INT,但后来意识到它是varchar –
现在它的工作,谢谢 –
停止思考程序上,而不是觉得跟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
OP在更新那些选定行之前想要执行一些操作这就是为什么使用循环 –
是的,我需要执行一些更改之前,我会更新我的问题。 –
你并不需要一个循环。一个更新语句将会执行 –
但是它需要搜索表中的很多行,并更新FlgEmProcesso中状态为0的所有人。 –
@ViniciusCano是的,但是这正是数据库引擎为你正确使用SQL所做的。 – jeroenh