2012-02-15 102 views
2

新しいジョブがデータベースに追加されたときに、SQL Serverによって作成されたdatetimeがあります。ジョブがデータベースに追加されてから3時間後にログレベルが完了せず、一意のジョブIDを持つジョブのステータスを変更する必要があります。日時比較更新2列

これまで私がこれまで行ってきたことです。 (状況を確認せずに)

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

あなたの変数@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は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