11

ストアドプロシージャを実行するシングルステップジョブがあります。データセット全体ではなくデルタを更新できるように、最後に成功したジョブ実行時刻の日付を取得したいと思います。

現在、ジョブを1日1回実行するように設定しているので、デフォルトのパラメーターがあり、nullの場合はGETDATE()-1に設定して、デルタを更新していますが、実行したいことは設定されています。ジョブが最後に正常に実行された日付。

exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime

現在の手順は次のようなものです

CREATE PROCEDURE dbo.usp_UpdateFrom
    @FromDate datetime = NULL --would like to pass last successful execution time of the job
AS
    IF @FromDate IS NULL
        SET @FromDate = GETDATE() - 1

    -- do stuff
END
4

5 に答える 5

19

必要なテーブルは、のsysjobssysjobhistoryですmsdb。警告されますが!SQL Serverは特定の数のレコードしか保持しないため、ジョブが多すぎて履歴が十分に大きくない場合は、履歴がなくなります。

次のコードは、指定さjob_idれたジョブ名のを取得し、履歴テーブルで最後に正常に終了した実行(つまり、ステップ0、ステータス1)を照会します。ご覧のとおり、SQL Serverは実行時間を2つのint列に格納するため、実行時間を日付に戻す必要があります。

DECLARE @job_id binary(16)
SELECT @job_id = job_id FROM msdb.dbo.sysjobs WHERE (name = N'YourJobName')

SELECT TOP 1
    CONVERT(DATETIME, RTRIM(run_date))
    + ((run_time / 10000 * 3600) 
    + ((run_time % 10000) / 100 * 60) 
    + (run_time % 10000) % 100) / (86399.9964) AS run_datetime
    , *
FROM
    msdb..sysjobhistory sjh
WHERE
    sjh.step_id = 0 
    AND sjh.run_status = 1 
    AND sjh.job_id = @job_id
ORDER BY
    run_datetime DESC
于 2010-01-22T04:52:25.323 に答える
4

sysjobhistory特定の数のレコードしか保持しないため、各ジョブとセッションの最後の実行「履歴」を保持するを使用することをお勧めしますsysjobactivity

SELECT TOP 1 start_execution_date
FROM msdb.dbo.sysjobactivity
WHERE run_requested_date IS NOT NULL
AND job_id = @job_id
ORDER BY session_id DESC;

注:セッションの存続期間中にジョブが実行されなかった場合、ほとんどすべての値はになりますnull

また、この情報を返すシステムストアドプロシージャ もあります。1つ以上のレコードを返すためのパラメータとして、などをsp_help_job受け入れます。job_idenabled

于 2016-11-16T12:12:29.867 に答える
2

この記事を見てください、それはあなたを正しい方向に向けるかもしれません。残念ながら、自宅のマシンにSQL Serverがないため、テストできません。

基本的に、sysjobactivityテーブルをクエリし、start_execution_dateとstop_execution_dateから値を取得する必要があります。job_idが必要ですが、どこから取得するのかわかりません。

これがお役に立てば幸いです。

編集 わかりました、私はさらにいくつかの調査を行い、次のコードスニペットを見つけました

DECLARE @jobId binary(16)

SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job')
于 2010-01-21T21:16:01.277 に答える
1

Lastを正常に実行するには、次のようにします。

SELECT 
    h.[job_id]
    ,j.Name JobName
    ,CONVERT(CHAR(10), CAST(STR(run_date,8, 0) AS dateTIME), 111)   [LastRunDate]
   ,STUFF(STUFF(RIGHT('000000' + 
    CAST (run_time AS`` VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') [LastRunTime]
   ,CASE run_status 
    WHEN 0 THEN 'Failed' 
    WHEN 1 THEN 'Succeeded' 
    WHEN 2 THEN 'Retry' 
    WHEN 3 THEN 'Cancelled' 
    WHEN 4 THEN 'In Progress' 
    END AS ExecutionStatus                                                 
    FROM [msdb].[dbo].[sysjobhistory] h 
    JOIN msdb.dbo.sysjobs j ON h.job_id=j.job_id 
    WHERE run_status=1 
    ORDER BY run_date DESC,run_time DESC
于 2017-09-19T10:25:35.417 に答える
0

次のスレッドからの情報を使用します。

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=112427 http://www.sqlservercentral.com/Forums/Topic542581-145-1.aspx

これが私が思いついたものです...

DECLARE 
    @statement nvarchar(72),
    @job_id uniqueidentifier,
    @last_run_date datetime

SET @statement = 'SET @guid = CAST(' + SUBSTRING(APP_NAME(), 30, 34) + ' as uniqueidentifier)'

EXECUTE sp_executesql @statement, N'@guid uniqueidentifier OUT', @guid = @job_id OUT

SELECT TOP (1)
    @last_run_date = CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime)
FROM msdb.dbo.sysjobhistory 
WHERE job_id = @job_id
AND run_status = 1
ORDER BY
    CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime) DESC

EXEC dbo.usp_UpdateFrom @last_run_date

私はこれに特に慣れていませんが、ジョブ名に応じてjob_idを取得するこの方法を好みます。

于 2010-01-22T15:46:47.587 に答える