【问题标题】:SQL - How to find currently running job steps through TSQLSQL - 如何通过 TSQL 查找当前正在运行的作业步骤
【发布时间】:2014-02-06 08:03:40
【问题描述】:

我正在编写一个查询以在 SQL 中查找当前正在运行的作业(我知道我们可以在 Job Active Monitor 中查看它,但我需要在 TSQL 中进行)。虽然我可以查询 sysjobactivity 表来查找当前正在运行的作业,但它无处说明正在运行的作业步骤(因为我的作业可能有超过 1 个步骤)。

我使用的查询:

SELECT s.name AS [JOB_NAME],
       '' AS [STEP_ID], 
       '' AS STEP_NAME, 
       'Processing' AS STATUS, 
       sja.run_requested_date AS START_TIME, 
       null AS END_DATE,
       convert(varchar, (getdate() - sja.run_requested_date), 8) AS Duration 
  FROM sysjobactivity sja, sysjobs s
 WHERE sja.job_id = s.job_id
   AND sja.run_requested_date >  getdate() - 1
   AND sja.stop_execution_date IS NULL

请帮我找到当前正在进行的作业的步骤 ID 和步骤名称。

【问题讨论】:

标签: sql tsql sql-job


【解决方案1】:

我认为下面的脚本有助于通过当前执行步骤获取 SQL 作业,试试这个

msdb.dbo.sp_help_job @execution_status = 1

【讨论】:

  • 感谢纳文。我看到指定为 current_execution_step 的列,我猜它就是我要查找的列。让我深入研究一下它是从哪个表或存储过程中提取的。感谢您提供的信息。
【解决方案2】:
DECLARE @StepCount INT
SELECT @StepCount = COUNT(1)
FROM msdb.dbo.sysjobsteps
WHERE job_id = '0523333-5C24-1526-8391-AA84749345666' --JobID


SELECT
         [JobName]
        ,[JobStepID]
        ,[JobStepName]
        ,[JobStepStatus]
        ,[RunDateTime]
        ,[RunDuration]
    FROM
    (
        SELECT 
                j.[name] AS [JobName]
            ,Jh.[step_id] AS [JobStepID]
            ,jh.[step_name] AS [JobStepName]
            ,CASE 
                WHEN jh.[run_status] = 0 THEN 'Failed'
                WHEN jh.[run_status] = 1 THEN 'Succeeded'
                WHEN jh.[run_status] = 2 THEN 'Retry (step only)'
                WHEN jh.[run_status] = 3 THEN 'Canceled'
                WHEN jh.[run_status] = 4 THEN 'In-progress message'
                WHEN jh.[run_status] = 5 THEN 'Unknown'
                ELSE 'N/A'
                END AS [JobStepStatus]
            ,msdb.dbo.agent_datetime(run_date, run_time) AS [RunDateTime]
            ,CAST(jh.[run_duration]/10000 AS VARCHAR)  + ':' + CAST(jh.[run_duration]/100%100 AS VARCHAR) + ':' + CAST(jh.[run_duration]%100 AS VARCHAR) AS [RunDuration]
            ,ROW_NUMBER() OVER 
            (
                PARTITION BY jh.[run_date]
                ORDER BY jh.[run_date] DESC, jh.[run_time] DESC
            ) AS [RowNumber]
        FROM 
            msdb.[dbo].[sysjobhistory] jh
            INNER JOIN msdb.[dbo].[sysjobs] j
                ON jh.[job_id] = j.[job_id]
        WHERE 
            j.[name] = 'ProcessCubes' --Job Name
            AND jh.[step_id] > 0
            AND CAST(RTRIM(run_date) AS DATE) = CAST(GETDATE() AS DATE) --Current Date
    ) A
    WHERE 
        [RowNumber] <= @StepCount
        AND [JobStepStatus] = 'Failed'

【讨论】:

    【解决方案3】:

    试试这个:

    SELECT distinct
          cast([sJOB].[job_id] as varchar(max)) AS execution_id 
        , [sJSTP].[step_name] AS executable_name
        , [sJOB].[name] AS package_name
        , CASE [sJSTP].[run_date]
            WHEN 0 THEN NULL
            ELSE
                CAST(
                    CAST([sJSTP].[run_date] AS CHAR(8))
                    + ' '
                    + STUFF(
                        STUFF(RIGHT('000000' + CAST([sJSTP].[run_time] AS VARCHAR(6)),  6)
                            , 3, 0, ':')
                        , 6, 0, ':')
                    AS DATETIME)
          END AS start_time,
          dateadd(ss, run_duration,   CASE [sJSTP].[run_date]
            WHEN 0 THEN NULL
            ELSE
                CAST(
                    CAST([sJSTP].[run_date] AS CHAR(8))
                    + ' '
                    + STUFF(
                        STUFF(RIGHT('000000' + CAST([sJSTP].[run_time] AS VARCHAR(6)),  6)
                            , 3, 0, ':')
                        , 6, 0, ':')
                    AS DATETIME)
          END) end_time
    --    , [sJSTP].[run_duration] [looptijd in minuten]
        , CASE [sJSTP].[run_status] 
            WHEN 0 THEN 'Failed'
            WHEN 1 THEN 'Success'
            WHEN 2 THEN 'Retry'
            WHEN 3 THEN 'Cancelled'
            WHEN 5 THEN 'Unknown'
          END AS execution_result_description
    FROM
        [msdb].[dbo].[sysjobhistory] AS [sJSTP]
        INNER JOIN [msdb].[dbo].[sysjobs] AS [sJOB]
            ON [sJSTP].[job_id] = [sJOB].[job_id]
        inner join [msdb].[dbo].[sysjobsteps] steps
            ON [sJSTP].[job_id] = [steps].[job_id]
    where [sJSTP].[run_date] <> 0
     and CASE [sJSTP].[run_date]
            WHEN 0 THEN NULL
            ELSE
                CAST(
                    CAST([sJSTP].[run_date] AS CHAR(8))
                    + ' '
                    + STUFF(
                        STUFF(RIGHT('000000' + CAST([sJSTP].[run_time] AS VARCHAR(6)),  6)
                            , 3, 0, ':')
                        , 6, 0, ':')
                    AS DATETIME)
          END  between dateadd(hh, -20, getdate()) and getdate()
     and [sJSTP].[step_name] not in ('(Job outcome)')
     order by start_time desc
    

    此外,我使用此查询来查看正在运行的 SSIS 作业的步骤结果。但是,这仅向您显示已完成的步骤,而不是正在运行的步骤。我仍然需要找到一个 SQL 来查看当前正在运行的步骤并将其与该步骤合并。

    select distinct
        cast(e.execution_id as varchar(max)),
        e.executable_name,
        e.package_name,
      CONVERT(datetime, es.start_time) AS start_time
    , CONVERT(datetime, es.end_time) AS end_time
    , datediff(mi, es.start_time, es.end_time) [running time]
    , case es.execution_result
        when 0 then 'Success'
        when 1 then 'Failed'
        when 2 then 'Completion'
        when 3 then 'Cancelled'
        else cast(es.execution_result as varchar(max)) end  as execution_result_description
    from ssisdb.catalog.executables e
    left join ssisdb.catalog.executable_statistics es
    on  e.executable_id = es.executable_id
     and e.execution_id = es.execution_id
    order by 6 desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2021-11-05
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多