【问题标题】:SQL Server Agent - Unique ID for Each Job ExecutionSQL Server 代理 - 每个作业执行的唯一 ID
【发布时间】:2018-07-19 17:55:27
【问题描述】:

我有这个查询,它为我的预定工作提供了很多有用的信息,但我仍然缺少一件事。我试图为每个作业执行找到一个唯一 ID,而不是实例或计划 ID。这是否存在,那么我将如何将它加入到我正在使用的当前表中?感谢您提供任何帮助。

谢谢!

编辑:我知道我可以为每天运行一次但大多数作业每天运行多次的作业创建一个唯一 ID。有些每 2 分钟运行一次。

            SELECT h.instance_id
                , j.job_id
                ,j.name AS JobName
                ,CASE 
                    WHEN h.step_name = '(Job outcome)'
                        THEN 'Job Run Time'
                    ELSE h.step_name
                    END AS StepName
                ,h.step_id
                ,CAST(STR(h.run_date, 8, 0) AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME) AS StartDatetime
                ,DATEADD(SECOND, ((h.run_duration / 1000000 * 86400 + (h.run_duration - h.run_duration / 1000000 * 1000000) / 10000 * 3600) + (h.run_duration - h.run_duration / 10000 * 10000) / 100 * 60) + (h.run_duration - h.run_duration / 100 * 100), CAST(STR(h.run_date, 8, 0) AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME)) AS EndDatetime
                ,CASE 
                    WHEN STUFF(STUFF(REPLACE(STR(h.run_duration, 6, 0), ' ', '0'), 3, 0, ':'), 6, 0, ':') > '23:59:00'
                        THEN '23:59:00'
                    ELSE STUFF(STUFF(REPLACE(STR(h.run_duration, 6, 0), ' ', '0'), 3, 0, ':'), 6, 0, ':')
                    END AS run_duration_formatted
                ,((h.run_duration / 1000000 * 86400 + (h.run_duration - h.run_duration / 1000000 * 1000000) / 10000 * 3600) + (h.run_duration - h.run_duration / 10000 * 10000) / 100 * 60) + (h.run_duration - h.run_duration / 100 * 100) AS RunDurationInSeconds
                ,CASE h.run_status
                    WHEN 0
                        THEN 'Failed'
                    WHEN 1
                        THEN 'Succeded'
                    WHEN 2
                        THEN 'Retry'
                    WHEN 3
                        THEN 'Cancelled'
                    WHEN 4
                        THEN 'In Progress'
                    END AS ExecutionStatus
            FROM msdb.dbo.sysjobhistory AS h
            INNER JOIN msdb.dbo.sysjobs AS j ON j.job_id = h.job_id
            LEFT JOIN [msdb].[dbo].[sysjobactivity] A ON A.job_id = h.job_id
            WHERE (j.enabled = 1)
            AND A.session_id = 1053
            AND (CAST(STR(h.run_date, 8, 0) AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME) >= DATEADD(dd, - 1, CAST(GETDATE() AS DATE)))
                Order by instance_id

【问题讨论】:

    标签: sql sql-server sql-server-agent


    【解决方案1】:

    也许与dense_rank()distinct 一起使用?

    SELECT distinct h.instance_id
                    , dense_rank() over (order by j.job_id, h.run_date, h.run_time)
                    , j.job_id
                    ,j.name AS JobName
                    ,CASE 
                        WHEN h.step_name = '(Job outcome)'
                            THEN 'Job Run Time'
                        ELSE h.step_name
                        END AS StepName
                    ,h.step_id
                    ,CAST(STR(h.run_date, 8, 0) AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME) AS StartDatetime
                    ,DATEADD(SECOND, ((h.run_duration / 1000000 * 86400 + (h.run_duration - h.run_duration / 1000000 * 1000000) / 10000 * 3600) + (h.run_duration - h.run_duration / 10000 * 10000) / 100 * 60) + (h.run_duration - h.run_duration / 100 * 100), CAST(STR(h.run_date, 8, 0) AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME)) AS EndDatetime
                    ,CASE 
                        WHEN STUFF(STUFF(REPLACE(STR(h.run_duration, 6, 0), ' ', '0'), 3, 0, ':'), 6, 0, ':') > '23:59:00'
                            THEN '23:59:00'
                        ELSE STUFF(STUFF(REPLACE(STR(h.run_duration, 6, 0), ' ', '0'), 3, 0, ':'), 6, 0, ':')
                        END AS run_duration_formatted
                    ,((h.run_duration / 1000000 * 86400 + (h.run_duration - h.run_duration / 1000000 * 1000000) / 10000 * 3600) + (h.run_duration - h.run_duration / 10000 * 10000) / 100 * 60) + (h.run_duration - h.run_duration / 100 * 100) AS RunDurationInSeconds
                    ,CASE h.run_status
                        WHEN 0
                            THEN 'Failed'
                        WHEN 1
                            THEN 'Succeded'
                        WHEN 2
                            THEN 'Retry'
                        WHEN 3
                            THEN 'Cancelled'
                        WHEN 4
                            THEN 'In Progress'
                        END AS ExecutionStatus
                FROM msdb.dbo.sysjobhistory AS h
                INNER JOIN msdb.dbo.sysjobs AS j ON j.job_id = h.job_id
                LEFT JOIN [msdb].[dbo].[sysjobactivity] A ON A.job_id = h.job_id
                WHERE (j.enabled = 1)
                --AND A.session_id = 1053
                AND (CAST(STR(h.run_date, 8, 0) AS DATETIME) + CAST(STUFF(STUFF(RIGHT('000000' + CAST(h.run_time AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME) >= DATEADD(dd, - 1, CAST(GETDATE() AS DATE)))
    Order by j.job_id, instance_id
    

    【讨论】:

      【解决方案2】:

      编辑:我在此查询中使用的表每 5 分钟填充一次我发布的第一个查询中的数据。

      好的,我找不到每个计划执行的唯一 ID,所以我不得不重新考虑我能做什么。查询如下。

      这解决了我的问题。我在 SharePoint 中嵌入了一个 Google 图表,其中列出了作业和运行时间。每个条形代表作业运行所需的时间。在此解决方案之前,如果最后一步失败,图表仅显示失败状态。现在有了这个,我可以看到每个作业执行是否有任何步骤失败。这是太棒了!在下图中,您可以看到红色的执行在作业中出现步骤失败。

              SELECT D.[instance_id]
                  ,[JobName]
                  ,[StepName]
                  ,[step_id]
                  ,[Run_Date]
                  ,[StartDatetime]
                  ,[StartTime]
                  ,[EndDatetime]
                  ,[End_Time]
                  ,[Run_Duration_Formatted]
                  ,[RunDurationInSeconds]
                  ,MAX(CASE WHEN C.ExecutionStatus IS NULL THEN D.[ExecutionStatus] ELSE C.ExecutionStatus END) AS ExecutionStatus
                  FROM [STG_EDW].[dbo].[Job_Runs_FINAL] AS D
                  LEFT JOIN 
                  (
                  SELECT Step0.Instance_ID
                  ,'Failed' AS ExecutionStatus
                  FROM(
                  SELECT [instance_id]
                  ,[JobName]
                  ,[StartDatetime]
                  ,[EndDatetime]
                  FROM [My Table]
                  WHERE step_id = 0) AS Step0
                  INNER JOIN(
                  SELECT Instance_ID, JobName, [StartDatetime], [EndDatetime]
                  FROM [My Table]
                  WHERE ExecutionStatus = 'Failed') AS B ON Step0.JobName = B.JobName AND B.StartDatetime >= Step0.StartDatetime AND B.EndDatetime <= Step0.EndDatetime
                  ) AS C ON D.instance_id = C.instance_id
                  Group By  D.[instance_id]
                  ,[JobName]
                  ,[StepName]
                  ,[step_id]
                  ,[Run_Date]
                  ,[StartDatetime]
                  ,[StartTime]
                  ,[EndDatetime]
                  ,[End_Time]
                  ,[Run_Duration_Formatted]
                  ,[RunDurationInSeconds]
      

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多