2012-02-15 173 views
2

我有一個datetime SQL Server創建一個新的作業被添加到數據庫時。將作業添加到數據庫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

'DATETIME'包含日期和時間。看看你的'DATEDIFF'。 – vulkanino 2012-02-15 15:42:55

+0

您可能需要更新語句中的where子句。現在,如果您通過if語句,您將更新所有**行。 – 2012-02-15 15:48:35

回答

1

您的變量@JobID已聲明但未設置 - 因此 - 您的IF語句永遠不會成功,因爲與NULL值的任何比較都將返回false。您可能需要將該值賦給變量,或使用IS NULL比較

0

這將無法工作,你不@JobID設置任何價值,這將是null,你存在的查詢總是會失敗

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 
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(分鐘...),但是這只是一個個人喜好,以確保一個逐個錯誤不會造成如此巨大的差異。

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