Я унаследовал сохранение хранимой процедуры, которая выполняется каждую ночь с помощью задания агента SQL. Он работает хорошо в течение нескольких месяцев, но все внезапные последние ночи повторяют какую-то работу и пропустили какую-то работу.SQL Server - Удалить из переменных таблицы не мгновенно?
Работа выполняется в середине ночи, и на данный момент пользователей нет. Я восстановил резервную копию базы данных непосредственно перед проблемным запуском на тестовый сервер, перезапустил процедуру, и все сработало нормально. Это небольшие данные, может быть, 100-200 строк за ночь.
Вот представление одной из петель в порядке, где проблема была обнаружена:
DECLARE @uniqueId int
DECLARE @examId int
DECLARE @TempSingleContactTable TABLE
(
uniqueId int IDENTITY(1,1) PRIMARY KEY,
examId int not null,
contactEmail nvarchar(max) null,
)
[data inserted into @TempSingleContactTable]
WHILE EXISTS (SELECT * FROM @TempSingleContactTable)
BEGIN
Select top 1 @uniqueId = uniqueId,
@examId = examID, from @TempSingleContactTable
[*****PROBLEM HERE- this line with same value for @examId ran multiple times, but eventually continued]
DELETE FROM @TempSingleContactTable WHERE examID = @examId
END
Единственное, что я могу видеть, что может привести к проблеме выше, если DELETE вызов не работает , Возможно ли, что вызов DELETE против переменной таблицы не мгновенен?
EDIT: Любая информация о том, что может быть причиной Удалить из @TempSingleContactTable на провал спорадически очень ценится.
EDIT 2: Дополнительное исследование показало, что это автоматизировано один раз по ночам процедура не удалась так же, как два раза в течение двух месяцев. Интересно, что каждый раз, когда он проваливался, прогон прошлой ночи не изменял никаких данных, и это всегда должно было быть. К сожалению, нет информации о регистрации, чтобы определить, что могло вызвать проблемы прошлых ночей. Похоже, что они должны быть связаны, хотя это может быть красная селедка. Я добавил регистрацию с надеждой получить фактическую основную причину.
Почему вы используете '@ examId' в качестве критерия в вашем заявлении о стирании, если он не гарантирован уникальным? '@ uniqueId' - лучший кандидат, так как это ваш первичный ключ. – Kritner
@Kritner, потому что работа, выполняемая в этом цикле, должна выполняться только один раз для идентификатора экзамена, и может быть несколько записей для одного контакта с тем же идентификатором экзамена. –