Это будет долго, мои извинения ...
У моего клиента SQL Server 2008 R2. Я сделал процедуру для обновления определенной таблицы. Цель состоит в том, чтобы обновить строки в тот же день, когда была запущена процедура (но, чтобы быть в безопасности, она обновляется еще на несколько дней в прошлое и в будущее. У меня есть задание агента SQL, которое Запланировано запускать один раз в день в полночь, чтобы запустить мою процедуру.
Если я запускаю процедуру вручную, она работает. Если я запускаю задание вручную (т. Е. Щелкните левой кнопкой мыши на задании в студии управления и выберите «Начать задание на шаге»), это сработает. Однако, если задание выполняется по расписанию, оно не работает. Согласно истории шаг с вызовом процедуры был выполнен без ошибок.
Если я каким-либо образом изменю расписание (например, изменю его на 00:10), то процедура будет работать только для этого одного дня, а на следующий день - нет. Мне удалось воспроизвести проблему вручную ровно один раз, поместив вызов процедуры в транзакцию - откат и затем просмотреть результат, но я не смог понять, почему мне удалось повторить проблему один раз. Также запуск того же самого через 5 минут снова был успешным.
У меня есть журнал, который показывает, что параметры одинаковы между успешным ручным запуском и неудачным запланированным запуском. Я даже проверил часть обновления процедуры с параметрами из журнала, и он работает таким образом. Я пытался увеличить количество запланированных заданий (до одного раза в час), но безрезультатно. Я также создал трассировку профилировщика, чтобы проверить, как процедура выполняется при вызове заданием, но я не могу найти в ней никакой ошибки. Также нет тупиков.
Я думаю, что проблема не в том, что он ничего не обновляет, а в том, что проблема заключается в обновлении нулевого значения. Однако я также не могу понять это, так как в журнале показано значение для переменной (@DayWorkGroupNum), в которой содержится значение обновления, и все же не имеет смысла, почему нулевое значение появляется только при планировании.
Наконец, неудавшееся обновление, кажется, длится 2 дня, а затем неожиданно обновляет все, что пропало (так устроен процесс, он находит первый пропущенный день, а затем обновляет все с этого момента, но по какой-то причине это работает только каждые 3 дня при работе по расписанию). Например, прямо сейчас нулевые значения охватывают сегодня и вчера, но когда-нибудь завтра, когда он запустится, он обновит все 3 дня. Это, однако, говорит мне, что это не проблема прав пользователя.
Проблемная часть процедуры такова:
UPDATE Dim_Shift SET WorkGroupNo = @DayWorkGroupNum
--SELECT * FROM Dim_Shift
WHERE date = DATEADD(DAY,@shiftIndex,@StartDate)
and ShiftNo = 15
and WorkPhaseID in (
SELECT WorkPhaseID FROM [Dim_WorkPhase]
WHERE MillID = @pMillNo
)
Это обновление запускается в цикле, который увеличивает @shiftIndex на единицу (начиная с 0). Цикл выполняется с текущего дня -1 до текущего дня + 2. Неисправное обновление касается ТОЛЬКО @shiftIndex 1 или 0 и 1.
Как я упоминал ранее, я включил ведение журнала, которое показывает мне, что @DayWorkGroupNum, @shiftIndex, @StartDate верны. @pMillNo - это параметр, который всегда равен 13. Это также часть, которую я протестировал, используя параметры, которые я получаю при ведении журнала, и если я отключаю часть обновления и включаю часть выбора, тогда выбор показывает именно тот набор результатов, который должен быть обновлен.
У меня также есть попытка перехвата для всей процедуры, и она настроена на запись ошибок отдельно, но ошибок не было.
Например, параметры для оператора обновления текущего дня:
@ shiftIndex = 1 (0 вчера), @DayWorkGroupNum = 1, @StartDate = 2019-05-01 (всегда сегодняшняя дата - 1 день)
Несколько примеров строк из таблицы ДО обновления
+-------------+------------+---------+-------------+
| WorkPhaseID | Date | ShiftNo | WorkGroupNo |
+-------------+------------+---------+-------------+
| 206 | 2019-05-02 | 15 | NULL |
| 207 | 2019-05-02 | 15 | NULL |
| 208 | 2019-05-02 | 15 | NULL |
| 209 | 2019-05-02 | 15 | NULL |
+-------------+------------+---------+-------------+
и после обновления это должно выглядеть так:
+-------------+------------+---------+-------------+
| WorkPhaseID | Date | ShiftNo | WorkGroupNo |
+-------------+------------+---------+-------------+
| 206 | 2019-05-02 | 15 | 1 |
| 207 | 2019-05-02 | 15 | 1 |
| 208 | 2019-05-02 | 15 | 1 |
| 209 | 2019-05-02 | 15 | 1 |
+-------------+------------+---------+-------------+
но вместо этого WorkGroupNo остается NULL. Совсем недавно я заметил, что если в workGroupNo есть какие-либо старые данные, то proc преобразует их в NULL, но это относится только к текущему, а иногда и накануне.
- EDIT--Я не смог объяснить выше, что рассматриваемая база данных очень старая и имеет довольно много трафика. Имея это в виду, я обнаружил, что проблема связана с таблицей: я добавил новый этап в задание, которое вызывает новую процедуру, которая записывает в совершенно новую таблицу, которую я создал сам, и которая работает просто отлично.