当新作业添加到数据库时,SQL Server创建了datetime
。将作业添加到数据库3小时后,如果未完成日志级别,则应更改具有唯一作业ID的作业的状态。
这是我到目前为止所拥有的。 (不检查状态)
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
但如果我运行查询,则不会影响任何行。请帮忙
答案 0 :(得分:1)
您的变量@JobID
已声明,但未设置 - 因此 - 您的IF
语句永远不会成功,因为与NULL值的任何比较都将返回false。您需要将值分配给变量,或使用IS NULL
比较
答案 1 :(得分:1)
有几件事......
您的@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
答案 2 :(得分:1)
如上面的答案所示,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(分钟......)代替小时,但这只是个人偏好,以确保逐个错误不会产生如此巨大的差异。
答案 3 :(得分:0)
这不起作用,因为您没有为@JobID
设置任何值,它将是null
并且您存在查询将始终失败
答案 4 :(得分:0)
在执行过程时,您没有给@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