Jeer
@Jeer
уверенный пользователь

Из-за чего происходит зацикливание sql скрипта?

[MS SQL Server]
Добрый день, в одну табличку [Contact Message In] попадают данные, есть признак Processed, устанавливается в 0. Мне нужно пробежаться циклом по всем таким записям, как-то обработать и установить Processed в 1. Вот мой код:
declare @nullDate datetime = '1753-01-01'
		, @exchangeCode varchar(20) = null;
		
	select top 1 @exchangeCode=No_ from [dbo].[Contact Message In] where Processed=0;
	
	while(@exchangeCode is not null)
	begin
		Print 'start loop ' + @exchangeCode
		
--код обработки, вырезал для краткости

		--помечаем записи обработанными
		update [Contact Message In] set Processed=1, [Received Message Date Time]=getdate() where No_=@exchangeCode and Processed=0;
		Print 'updated' --вот тут фактически не происходит обновление
		
		--берём следующую строку
		select top 1 @exchangeCode=No_ from [dbo].[Contact Message In] where Processed=0;
		Print 'next loop for ' + @exchangeCode --выводит ту же самую запись, хотя должен брать следующую
		
	end


Собственно, пометил комментариями, допустим, приходит одна запись, цикл встаёт в бесконечность, при этом, если я вручную останавливаю запрос, то update [Contact Message In] set Processed=1 отрабатыват корректно. При запущенном цикле не отрабатывает, вот такой вывод я получаю, если останавливаю вручную:

start loop CNT105740

(1 row affected)

(1 row affected)
updated
next loop for CNT105740
start loop CNT105740

(0 rows affected)

(0 rows affected)
updated
next loop for CNT105740
start loop CNT105740

(0 rows affected)

(0 rows affected)
updated
next loop for CNT105740
start loop CNT105740
....
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
Jeer
@Jeer Автор вопроса
уверенный пользователь
Так, кому интересно, поставил WAITFOR DELAY '00:00'; после апдейта
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Эээээ
update [Contact Message In]
set Processed=1, [Received Message Date Time]=getdate()
where Processed=0
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы