52

ジョブをスケジュールするストアド プロシージャがあります。このジョブは完了するまでに長い時間がかかります (約 30 ~ 40 分)。このジョブのステータスを知る必要があります。以下の詳細は私を助けるでしょう

1) 将来に予定されていて、まだ開始されていないすべてのジョブのリストを表示する方法

2) 実行中のジョブのリストと実行中からの時間範囲を表示する方法

3) ジョブが正常に完了したか、エラーのために途中で停止したかを確認する方法。

4

15 に答える 15

48

システム ストアド プロシージャ sp_help_job を使用してみることができます。これにより、ジョブ、そのステップ、スケジュール、およびサーバーに関する情報が返されます。例えば

EXEC msdb.dbo.sp_help_job @Job_name = 'Your Job Name'

SQL Books Onlineには、返されるレコードに関する多くの情報が含まれている必要があります。

複数のジョブに関する情報を返すには、ジョブに関するさまざまな情報を保持する次のシステム テーブルをクエリしてみてください。

  • msdb.dbo.SysJobs
  • msdb.dbo.SysJobSteps
  • msdb.dbo.SysJobSchedules
  • msdb.dbo.SysJobServers
  • msdb.dbo.SysJobHistory

それらの名前は一目瞭然です (ジョブが最後に実行されたときと結果に関する情報を保持する SysJobServer は別として)。

ここでも、フィールドに関する情報は MSDN にあります。たとえば、SysJobsのページを確認してください。

于 2008-10-14T07:41:05.680 に答える
27

これは、実行中のジョブを取得するために使用しているものです (主に、おそらくハングしたジョブを強制終了できるようにするためです)。

SELECT
    job.Name, job.job_ID
    ,job.Originating_Server
    ,activity.run_requested_Date
    ,datediff(minute, activity.run_requested_Date, getdate()) AS Elapsed
FROM
    msdb.dbo.sysjobs_view job 
        INNER JOIN msdb.dbo.sysjobactivity activity
        ON (job.job_id = activity.job_id)
WHERE
    run_Requested_date is not null 
    AND stop_execution_date is null
    AND job.name like 'Your Job Prefix%'

ティムが言ったように、MSDN / BOL のドキュメントは、sysjobsX テーブルの内容についてはかなり適切です。これらは MSDB のテーブルであることを覚えておいてください。

于 2008-10-26T13:18:54.627 に答える
15
-- Microsoft SQL Server 2008 Standard Edition:
IF EXISTS(SELECT 1 
          FROM msdb.dbo.sysjobs J 
          JOIN msdb.dbo.sysjobactivity A 
              ON A.job_id=J.job_id 
          WHERE J.name=N'Your Job Name' 
          AND A.run_requested_date IS NOT NULL 
          AND A.stop_execution_date IS NULL
         )
    PRINT 'The job is running!'
ELSE
    PRINT 'The job is not running.'
于 2012-04-03T12:43:37.580 に答える
3

詳細を取得するために、さまざまな方法で msdb を照会できます。

少数です

select job.Name, job.job_ID, job.Originating_Server,activity.run_requested_Date,
datediff(minute, activity.run_requested_Date, getdate()) as Elapsed 
from msdb.dbo.sysjobs_view job 
inner join msdb.dbo.sysjobactivity activity on (job.job_id = activity.job_id) 
where run_Requested_date is not null 
and stop_execution_date is null 
and job.name like 'Your Job Prefix%'
于 2011-11-11T14:49:34.257 に答える
2

これらの詳細を表示する方法が指定されていません。

一見すると、Server Management Studioを確認することをお勧めします。

ジョブの下の SQL Server エージェント パーツで、ジョブと現在のステータスを確認できます。ジョブを選択すると、[プロパティ] ページにジョブ履歴へのリンクが表示され、開始時刻と終了時刻、エラーが発生したかどうか、エラーの原因となったステップなどを確認できます。

ジョブが正常に完了したか失敗したときに、アラートと通知を指定して、電子メールで送信したり、ページに呼び出したりすることができます。

ジョブ アクティビティ モニターはありますが、実際に使用したことはありません。お試しいただけます。

T-SQL 経由で確認したい場合は、その方法がわかりません。

于 2008-10-14T07:26:37.130 に答える
1

ジョブの 1 つが実行されるため、MSDB テーブル (別名、上記のコード) をクエリするサーバーの 1 つで問題が発生しましたが、そうではありませんでした。実行ステータスを返すシステム ストアド プロシージャがありますが、insert exec ステートメントをエラーなしで実行することはできません。その内部には、insert exec ステートメントで使用できる別のシステム ストアド プロシージャがあります。

INSERT INTO #Job
EXEC master.dbo.xp_sqlagent_enum_jobs 1,dbo

そして、それをロードするテーブル:

CREATE TABLE #Job 
               (job_id               UNIQUEIDENTIFIER NOT NULL,  
               last_run_date         INT              NOT NULL,  
               last_run_time         INT              NOT NULL,  
               next_run_date         INT              NOT NULL,  
               next_run_time         INT              NOT NULL,  
               next_run_schedule_id  INT              NOT NULL,  
               requested_to_run      INT              NOT NULL, -- BOOL  
               request_source        INT              NOT NULL,  
               request_source_id     sysname          COLLATE database_default NULL,  
               running               INT              NOT NULL, -- BOOL  
               current_step          INT              NOT NULL,  
               current_retry_attempt INT              NOT NULL,  
               job_state             INT              NOT NULL) 
于 2016-09-19T23:06:23.293 に答える
1

上記のタスクは機能しますが、msdb.dbo.sysjobactivity で run_Requested_date が null ではなく、stop_execution_date が null である多くのレコードを見てきました ---- ジョブは現在実行されていません。

次のスクリプトを実行して、偽のエントリをすべて消去することをお勧めします (その時点でジョブが実行されていないことを確認してください)。

SQL2008:

    delete activity
    from msdb.dbo.sysjobs_view job  
    inner join msdb.dbo.sysjobactivity activity on job.job_id = activity.job_id 
    where  
        activity.run_Requested_date is not null  
    and activity.stop_execution_date is null  
于 2015-06-17T17:10:08.047 に答える
0
;WITH CTE_JobStatus
AS (
    SELECT DISTINCT NAME AS [JobName]
        ,s.step_id
        ,s.step_name
        ,CASE 
            WHEN [Enabled] = 1
                THEN 'Enabled'
            ELSE 'Disabled'
            END [JobStatus]
        ,CASE 
            WHEN SJH.run_status = 0
                THEN 'Failed'
            WHEN SJH.run_status = 1
                THEN 'Succeeded'
            WHEN SJH.run_status = 2
                THEN 'Retry'
            WHEN SJH.run_status = 3
                THEN 'Cancelled'
            WHEN SJH.run_status = 4
                THEN 'In Progress'
            ELSE 'Unknown'
            END [JobOutcome]
        ,CONVERT(VARCHAR(8), sjh.run_date) [RunDate]
        ,CONVERT(VARCHAR(8), STUFF(STUFF(CONVERT(TIMESTAMP, RIGHT('000000' + CONVERT(VARCHAR(6), sjh.run_time), 6)), 3, 0, ':'), 6, 0, ':')) RunTime
        ,RANK() OVER (
            PARTITION BY s.step_name ORDER BY sjh.run_date DESC
                ,sjh.run_time DESC
            ) AS rn
        ,SJH.run_status
    FROM msdb..SYSJobs sj
    INNER JOIN msdb..SYSJobHistory sjh ON sj.job_id = sjh.job_id
    INNER JOIN msdb.dbo.sysjobsteps s ON sjh.job_id = s.job_id
        AND sjh.step_id = s.step_id
    WHERE (sj.NAME LIKE 'JOB NAME')
        AND sjh.run_date = CONVERT(CHAR, getdate(), 112)
    )
SELECT *
FROM CTE_JobStatus
WHERE rn = 1
    AND run_status NOT IN (1,4)
于 2016-04-06T06:40:00.907 に答える