Хранимая процедура не выполняется правильно при запуске заданием сервера SQL - PullRequest
1 голос
/ 02 мая 2019

Это будет долго, мои извинения ...

У моего клиента 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--Я не смог объяснить выше, что рассматриваемая база данных очень старая и имеет довольно много трафика. Имея это в виду, я обнаружил, что проблема связана с таблицей: я добавил новый этап в задание, которое вызывает новую процедуру, которая записывает в совершенно новую таблицу, которую я создал сам, и которая работает просто отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...