Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中获取上次运行作业的详细信息_Sql_Sql Server_Sql Server Agent - Fatal编程技术网

如何在SQL中获取上次运行作业的详细信息

如何在SQL中获取上次运行作业的详细信息,sql,sql-server,sql-server-agent,Sql,Sql Server,Sql Server Agent,如何使用SQL在SQL Server代理中获取上次运行作业的详细信息,包括仅用于上次运行作业(而不是作业结果)的步骤详细信息,因为我希望在应用程序中显示此信息 请帮助我,我已经被困在这个问题上很久了 这是我在下面使用的代码,它返回了作业历史中所有作业的所有步骤 但是,我只想查看上次运行作业的步骤 谢谢 USE msdb Go SELECT j.name JobName,h.step_name StepName, CONVERT(CHAR(10), CAST(STR(h.run_date,8,

如何使用SQL在SQL Server代理中获取上次运行作业的详细信息,包括仅用于上次运行作业(而不是作业结果)的步骤详细信息,因为我希望在应用程序中显示此信息

请帮助我,我已经被困在这个问题上很久了

这是我在下面使用的代码,它返回了作业历史中所有作业的所有步骤

但是,我只想查看上次运行作业的步骤

谢谢

USE msdb
Go 
SELECT j.name JobName,h.step_name StepName, 
CONVERT(CHAR(10), CAST(STR(h.run_date,8, 0) AS dateTIME), 111) RunDate, 
STUFF(STUFF(RIGHT('000000' + CAST ( h.run_time AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') RunTime, 
h.run_duration StepDuration,
    case h.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, 
h.message MessageGenerated
FROM sysjobhistory h 
inner join sysjobs j
ON j.job_id = h.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]
                WHERE [step_id] = 0
            ) AS [sJOBH]
            ON j.[job_id] = [sJOBH].[job_id]
            AND [sJOBH].[RowNumber] = 1

where j.job_id = 'F04E5D3B-C873-448A-805C-C6309A92DAEC'

ORDER BY j.name, h.run_date, h.run_time desc
GO
希望这有帮助

添加到msdb.dbo.sysjobactivity的连接将显示作业级别的开始/结束时间。使用此范围,可以指定仅显示最近运行的作业步骤

    DECLARE @job_id UNIQUEIDENTIFIER 
            ,@job_name  VARCHAR(256)

    SET @job_id = 'DF4C9555-5B24-4649-97CE-5708C53F762C'
    SET @job_name = 'syspolicy_purge_history'

    --search for job_id if none was provided
    SELECT  @job_id = COALESCE(@job_id,job_id)
    FROM    msdb.dbo.sysjobs 
    WHERE   name = @job_name

    SELECT  t2.instance_id
            ,t1.name as JobName
            ,t2.step_id as StepID
            ,t2.step_name as StepName
            ,CONVERT(CHAR(10), CAST(STR(t2.run_date,8, 0) AS DATETIME), 111) as RunDate
            ,STUFF(STUFF(RIGHT('000000' + CAST ( t2.run_time AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') as RunTime
            ,t2.run_duration
            ,CASE t2.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
            ,t2.message as MessageGenerated    
    FROM    msdb.dbo.sysjobs t1
    JOIN    msdb.dbo.sysjobhistory t2
            ON t1.job_id = t2.job_id   
            --Join to pull most recent job activity per job, not job step
    JOIN    (
            SELECT  TOP 1
                    t1.job_id
                    ,t1.start_execution_date
                    ,t1.stop_execution_date
            FROM    msdb.dbo.sysjobactivity t1
            --If no job_id detected, return last run job
            WHERE   t1.job_id = COALESCE(@job_id,t1.job_id)
            ORDER 
            BY      last_executed_step_date DESC
            ) t3
            --Filter on the most recent job_id
            ON t1.job_id = t3.job_Id
            --Filter out job steps that do not fall between start_execution_date and stop_execution_date
            AND CONVERT(DATETIME, CONVERT(CHAR(8), t2.run_date, 112) + ' ' 
            + STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(8), t2.run_time), 6), 5, 0, ':'), 3, 0, ':'), 121)  
            BETWEEN t3.start_execution_date AND t3.stop_execution_date

编辑:在顶部添加了两个参数,@job\u id和@job\u name。如果未提供@job_id,首先它将尝试确定提供的@job_名称的job_id,并返回上次运行的job is no value

您可以将此查询与另一个查询连接起来,该查询执行Max(last_run_date),并按作业名称分组。然后你的join子句就可以加入到作业中,也可以加入到最后一次运行中。嗨,谢谢,这太完美了!非常感谢您,我想添加的一个修改是仅显示带有特定作业id的最后一次作业运行,如果您可以添加它,那将是令人惊讶的!