Сравнение даты и времени обновления двух столбцов - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть datetime, созданный SQL Server при добавлении нового задания в базу данных. Через 3 часа после того, как задание добавлено в базу данных и не завершено, уровень логирования и статус задания с уникальным идентификатором задания должны быть изменены.

Это то, что я имею до сих пор. (Без проверки статуса)

use DistributedComputing
if exists (select * from sys.objects where type = 'P' and name = 'proc_dc_timeout')
drop procedure proc_dc_timeout
go
create procedure proc_dc_timeout
AS
declare @JobID int
begin
if exists (select StartDate from Job where JobID = @JobID and DATEDIFF(hh,StartDate,GETDATE()) > 3 )
update Job
set LogLevel = 1, Status = 'error'
end

go
execute proc_dc_timeout

Но если я выполню запрос, строки не будут изменены. Пожалуйста, помогите

Ответы [ 5 ]

1 голос
/ 15 февраля 2012

Как видно из приведенного выше ответа, JobID является нулевым. Предполагая, что вы хотите проверить и обновить все задания, это может быть тем, что вам нужно:

create procedure proc_dc_timeout
AS
update Job
set LogLevel = 1, Status = 'error'
where DATEDIFF( minute, StartDate, GETDATE() ) > 180
    and Status not in ( 'error' )

Я использовал DATEDIFF (минуты ...) вместо часа, но это личное предпочтение, чтобы убедиться, что ошибка «один на один» не имеет такого большого значения.

1 голос
/ 15 февраля 2012

Пара вещей ...

Кажется, ваша переменная @JobID должна быть параметром процедуры.Вы никогда не задаете значение этой переменной.

Во-вторых, ваш DATEDIFF(hh, StartDate, GETDATE()) > 3, скорее всего, должен быть изменен на DATEDIFF(hh, StartDate, GETDATE()) >= 3;как написано в настоящее время, вы не будете делать никаких обновлений, пока не будет достигнута 4-часовая отметка.

Кроме того, вы рассматривали возможность использования синтаксиса ALTER PROCEDURE вместо проверки существования процедуры и удаления / воссоздания вкаждый пробег?

ALTER PROCEDURE proc_dc_timeout ( @JobID INT )
AS
    BEGIN
        UPDATE j
        SET j.[LogLevel = 1,
            j.[Status] = 'error'
        FROM [Job] j
        WHERE j.[JobID] = @JobID
            AND DATEDIFF(hh, j.[StartDate], GETDATE()) >= 3
    END
GO
1 голос
/ 15 февраля 2012

Ваша переменная @JobID объявлена, но не установлена, поэтому ваш оператор IF никогда не будет успешным, потому что любое сравнение со значением NULL вернет false. Вам нужно либо присвоить значение переменной, либо использовать IS NULL сравнение

0 голосов
/ 15 февраля 2012

Вы не указали @JobID значение при выполнении процедуры, и объявление параметра находится в неверном месте.

CREATE PROCEDURE proc_dc_timeout
   @JobID int // <== declare parameter here
AS
BEGIN
    //...
END
go

EXECUTE proc_dc_timeout @JobID // <== put value here instead @JobID
0 голосов
/ 15 февраля 2012

это не будет работать, так как вы не устанавливаете какое-либо значение для @JobID, и оно будет null, и ваш существующий запрос будет всегда сбой

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