2016-08-25 3 views
1

Я пытаюсь написать запрос, чтобы найти текущий статус задания агента SQL. Это поле существует в столбце «Состояние» в «Мониторе активности работы». Смотрите скриншот ниже:SQL Querying Activity Activity Monitor для статуса

enter image description here

Я использую запросы, найденные на this site (запрос также ниже), которые являются большими, но статус возвращается в состояние работы, которая уже была запущена.

Кто-нибудь знает, как запросить текущий статус или статус, на котором закончилось задание? В приведенном выше примере я хотел бы вернуть «Выполнение 1 (Run Query)». «Run Query» - это имя шага 1 задания.

SELECT 
    [sJOB].[job_id] AS [JobID] 
    , [sJOB].[name] AS [JobName] 
    , CASE 
     WHEN [sJOBH].[run_date] IS NULL OR [sJOBH].[run_time] IS NULL THEN NULL 
     ELSE CAST(
       CAST([sJOBH].[run_date] AS CHAR(8)) 
       + ' ' 
       + STUFF(
        STUFF(RIGHT('000000' + CAST([sJOBH].[run_time] AS VARCHAR(6)), 6) 
         , 3, 0, ':') 
        , 6, 0, ':') 
       AS DATETIME) 
     END AS [LastRunDateTime] 
    , CASE [sJOBH].[run_status] 
     WHEN 0 THEN 'Failed' 
     WHEN 1 THEN 'Succeeded' 
     WHEN 2 THEN 'Retry' 
     WHEN 3 THEN 'Canceled' 
     WHEN 4 THEN 'Running' -- In Progress 
     END AS [LastRunStatus] 
    , STUFF(
      STUFF(RIGHT('000000' + CAST([sJOBH].[run_duration] AS VARCHAR(6)), 6) 
       , 3, 0, ':') 
      , 6, 0, ':') 
     AS [LastRunDuration (HH:MM:SS)] 
    , [sJOBH].[message] AS [LastRunStatusMessage] 
    , CASE [sJOBSCH].[NextRunDate] 
     WHEN 0 THEN NULL 
     ELSE CAST(
       CAST([sJOBSCH].[NextRunDate] AS CHAR(8)) 
       + ' ' 
       + STUFF(
        STUFF(RIGHT('000000' + CAST([sJOBSCH].[NextRunTime] AS VARCHAR(6)), 6) 
         , 3, 0, ':') 
        , 6, 0, ':') 
       AS DATETIME) 
     END AS [NextRunDateTime] 
FROM 
    [msdb].[dbo].[sysjobs] (NOLOCK) AS [sJOB] 
    LEFT JOIN (
       SELECT 
        [job_id] 
        , MIN([next_run_date]) AS [NextRunDate] 
        , MIN([next_run_time]) AS [NextRunTime] 
       FROM [msdb].[dbo].[sysjobschedules] (NOLOCK) 
       GROUP BY [job_id] 
      ) AS [sJOBSCH] 
     ON [sJOB].[job_id] = [sJOBSCH].[job_id] 
    LEFT JOIN (
       SELECT 
        [job_id] 
        , [run_date] 
        , [run_time] 
        , [run_status] 
        , [run_duration] 
        , [message] 
        , ROW_NUMBER() OVER (
              PARTITION BY [job_id] 
              ORDER BY [run_date] DESC, [run_time] DESC 
        ) AS RowNumber 
       FROM [msdb].[dbo].[sysjobhistory] (NOLOCK) 
       WHERE [step_id] = 0 
      ) AS [sJOBH] 
     ON [sJOB].[job_id] = [sJOBH].[job_id] 
     AND [sJOBH].[RowNumber] = 1 
WHERE [sJOB].[job_id] = '527BA180-A5D9-4492-98F0-705889EBCFC4' 
ORDER BY [JobName] 
+0

Я ничего не знаю о агенте SQL, но я бы запустил SQL Profiler, чтобы увидеть фактический запрос, который запускается на сервере, чтобы получить набор результатов, который вы видите на скриншоте. –

ответ

3

В таблице, которая содержит информацию о состоянии на самом деле является расширенной хранимой процедуры называется xp_sqlagent_enum_jobs. Доступ к нему осуществляется через sp_help_job, который документирован here. Если вы позвоните по номеру sp_help_job без каких-либо параметров, он будет содержать столбцы current_execution_status и current_execution_step, и это то, что вам нужно.

Если вы немного покопаться внутри sp_help_job, вы можете увидеть, что xp_sqlagent_enum_jobs вызывается со следующими параметрами:

IF ((@@microsoftversion/0x01000000) >= 8) -- SQL Server 8.0 or greater 
    INSERT INTO @xp_results 
    EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner, @job_id 
ELSE 
    INSERT INTO @xp_results 
    EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner 

Вы можете принять это дальше, скопировать структуру временной таблицы и вызвать его самостоятельно, так что вы можете выбрать вишневый результаты:

declare @job_name sysname = 'fill in your jobname here'; 
declare @job_id uniqueidentifier = (select top 1 job_id from msdb..sysjobs where name = @job_name); 
declare @job_owner sysname = (SELECT SUSER_SNAME()); 
declare @xp_results TABLE (
    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); 

INSERT INTO @xp_results 
    EXECUTE master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id 

SELECT sj.name, 
    case xpr.job_state when 1 then 'Executing: ' + cast(sjs.step_id as nvarchar(2)) + ' (' + sjs.step_name + ')' 
     when 2 then 'Waiting for thread' 
     when 3 then 'Between retries' 
     when 4 then 'Idle' 
     when 5 then 'Suspended' 
     when 7 then 'Performing completion actions' 
    end as [status] 
FROM @xp_results       xpr 
inner join msdb..sysjobs sj on xpr.job_id = sj.job_id 
LEFT OUTER JOIN msdb.dbo.sysjobsteps sjs ON ((xpr.job_id = sjs.job_id) AND (xpr.current_step = sjs.step_id)), 
    msdb.dbo.sysjobs_view    sjv 
WHERE (sjv.job_id = xpr.job_id) 

Обратите внимание, что если вы просто оставить @job_name в нуле, возвращается для всех рабочих мест.

+0

Это именно то, что я искал. Спасибо! –

0

Обычно я использую этот запрос, чтобы проверить статус запуска работы, вы ищете это? Это от MSDN, а

SELECT sj.Name, 
CASE 
    WHEN sja.start_execution_date IS NULL THEN 'Not running' 
    WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL THEN 'Running' 
    WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NOT NULL THEN 'Not running' 
END AS 'RunStatus' 
FROM msdb.dbo.sysjobs sj 
JOIN msdb.dbo.sysjobactivity sja 
ON sj.job_id = sja.job_id 
WHERE session_id = (
SELECT MAX(session_id) FROM msdb.dbo.sysjobactivity); 
+0

Спасибо, Kannan, это довольно хороший обходной путь, и я мог бы немного изменить его, чтобы приблизиться к тому, что мне нужно, но я больше ищу, чтобы запросить любые таблицы, в которых точно указан текст в поле «Статус». В примере в моем вопросе я хочу найти «Выполнение: 1 (Run Query)» –

0

ИСПОЛЬЗОВАНИЕ MSDB ВЫПЛН dbo.sp_help_job

execution_status является параметром в SP.

Значение Описание

  • 0 Возвращает только те рабочие места, которые не простаивает или приостановлено.
  • 1 Выполнение.
  • 2 Ожидание потока.
  • 3 Между повторения.
  • 4 Idle.
  • 5 Приостановлено.
  • 7 Выполнение действий по завершению.

Exec msdb.dbo.sp_help_job @execution_status = 1

Смежные вопросы