2012-02-15 8 views
2

새 작업이 데이터베이스에 추가 될 때 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

'날짜'는 날짜와 시간을 포함합니다. 'DATEDIFF'를 확인하십시오. – vulkanino

+0

업데이트 구문에 where 절이 필요할 수 있습니다. if 문을 전달하면 ** 모든 ** 행을 업데이트합니다. –

답변

1

변수 값 이 선언되었지만 설정되지 않았습니다. 따라서 NULL 값과의 비교가 false를 반환하므로 IF 문이 성공하지 못합니다. 당신은 변수에 값을 할당해야하거나 IS NULL 비교

0

를 사용 이것이 당신이 @JobID에 대한 값을 설정하지 않는 한대로 작동하지 않습니다 그것은 null 될 것입니다 그리고 당신은 쿼리가 항상

1

몇 가지를 실패 존재 하나 ...

귀하의 @JobID 변수는 절차의 매개 변수 여야합니다. 이 변수에 절대로 값을 부여하지 않습니다.

두 번째로 DATEDIFF(hh, StartDate, GETDATE()) > 3DATEDIFF(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

위의 답변에서 JobID는 null입니다.

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 (분 ...)를 사용하지만 확실히를 만들기 위해 단지 개인적인 취향 : 당신이 모든 작업을 확인하고 업데이트 할 것을 가정하면, 이것은 당신이 원하는 수 있습니다 off-by-one 오류는 그렇게 큰 차이를 만들지 않습니다.

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