복붙노트

[SQL] 어떻게 작업의 상태를 확인할 수 있습니까?

SQL

어떻게 작업의 상태를 확인할 수 있습니까?

나는 어떤 일정 작업을 저장 프로 시저가 있습니다. 이 작업은 많은 시간 (약 30 분 ~ 40) 완료 얻을합니다. 나는이 작업의 상태를 알 수 있어야합니다. 자세한 내용은 나에게 도움이 될 아래

1) 어떻게 미래의 시간 예정있어 모든 작업의 ​​목록을 확인하고 시작하는 데 아직

그들이 실행하는 경우 2) 방법을에서 실행중인 작업의 목록과 시간 범위를 볼 수 있습니다

작업이 성공적으로 완료 또는 때문에 오류의 사이에 정지 한 경우 3) 방법을 참조하십시오.

해결법

  1. ==============================

    1.당신은 시스템 저장 프로 시저의 sp_help_job를 사용하여 시도 할 수 있습니다. 이 작업 그 단계, 일정 및 서버에 대한 정보를 반환합니다. 예를 들면

    당신은 시스템 저장 프로 시저의 sp_help_job를 사용하여 시도 할 수 있습니다. 이 작업 그 단계, 일정 및 서버에 대한 정보를 반환합니다. 예를 들면

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

    SQL 온라인은 반환 레코드에 대한 정보를 많이 포함해야합니다.

    여러 작업에 대한 정보를 반환를 들어, 작업에 대한 정보의 다양한 비트를 누른 다음 시스템 테이블을 쿼리 시도 할 수

    그들의 이름은 매우 자명 (떨어져있는 보류 정보에 SysJobServers에서 때 작업 마지막 실행 및 결과)이다.

    다시 말하지만, 필드에 대한 정보는 MSDN에서 찾을 수 있습니다. 예를 들어, SysJobs의 페이지를 체크 아웃

  2. ==============================

    2.나는이 페이지의 T-SQL의 어느 것도 오탐 (false positive)을 포함 할 수있다, 따라서 그들 중 누구도 현재 세션에만 얻을 수있는 syssessions 테이블에 참여하지 않기 때문에 정확하게 작동하지 것이다 것을 지적하고 싶습니다.

    나는이 페이지의 T-SQL의 어느 것도 오탐 (false positive)을 포함 할 수있다, 따라서 그들 중 누구도 현재 세션에만 얻을 수있는 syssessions 테이블에 참여하지 않기 때문에 정확하게 작동하지 것이다 것을 지적하고 싶습니다.

    이 참조를 참조하십시오 : 그것은 무엇 널 중지 날짜에 작업을 의미 하는가?

    또한 MSDB에 sp_help_jobactivity 절차를 분석하여 유효성을 검사 할 수 있습니다.

    나는이 SO에 오래된 메시지임을 알지만 때문에 문제의이 메시지는 부분적으로 만 도움이되었다고합니다.

    SELECT
        job.name, 
        job.job_id, 
        job.originating_server, 
        activity.run_requested_date, 
        DATEDIFF( SECOND, activity.run_requested_date, GETDATE() ) as Elapsed
    FROM 
        msdb.dbo.sysjobs_view job
    JOIN
        msdb.dbo.sysjobactivity activity
    ON 
        job.job_id = activity.job_id
    JOIN
        msdb.dbo.syssessions sess
    ON
        sess.session_id = activity.session_id
    JOIN
    (
        SELECT
            MAX( agent_start_date ) AS max_agent_start_date
        FROM
            msdb.dbo.syssessions
    ) sess_max
    ON
        sess.agent_start_date = sess_max.max_agent_start_date
    WHERE 
        run_requested_date IS NOT NULL AND stop_execution_date IS NULL
    
  3. ==============================

    3.이것은 내가 (나는 아마 걸어 한 사람을 죽일 수 있도록 주로) 실행중인 작업을 얻기 위해 사용하고 무엇을 :

    이것은 내가 (나는 아마 걸어 한 사람을 죽일 수 있도록 주로) 실행중인 작업을 얻기 위해 사용하고 무엇을 :

    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의 테이블을 기억.

  4. ==============================

    4.

    -- 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.'
    
  5. ==============================

    5.우리는 세부 사항을 얻을 수있는 여러 가지 방법으로 MSDB를 조회 할 수 있습니다.

    우리는 세부 사항을 얻을 수있는 여러 가지 방법으로 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%'
    
  6. ==============================

    6.당신은 당신이 세부 사항을보고 싶습니다 방법을 지정하지 않았습니다.

    당신은 당신이 세부 사항을보고 싶습니다 방법을 지정하지 않았습니다.

    첫눈 위해 나는 Server Management Studio를 확인하는 것이 좋습니다 것입니다.

    당신은 채용에 따라, SQL Server 에이전트 일부 작업 및 현재 상태를 볼 수 있습니다. 당신이 직업을 선택하는 경우, 속성 페이지 쇼 당신은 시작 시간과 종료 시간을 볼 수있는 작업 기록에 대한 링크, 만약 거기에 이렇게 오류를 발생하고, 단계 오류.

    당신은 알림 및 통지는 당신이나 작업이 성공적으로 완료 또는 실패 페이지를에 이메일을 지정할 수 있습니다.

    거기에 작업 활동 모니터는, 실제로 나는 그것을 사용하지 않았다. 당신은 시도 할 수 있습니다.

    당신이 T-SQL을 통해 그것을 확인하고 싶은 경우에, 나는 당신이 그렇게 할 수있는 방법을 모르겠어요.

  7. ==============================

    7.이것은 오래된 질문이지만, 난 그냥 SQL 서버 작업의 상태를 확인하기 위해 필요한 비슷한 상황이 있었다. 많은 사람들은 sysjobactivity 테이블을 언급하고 대단한 MSDN 설명서 지적했다. 그러나, 나는 또한 당신의 서버에 정의 된 모든 작업의 ​​상태를 제공하는 작업 활동 모니터를 강조하고 싶습니다.

    이것은 오래된 질문이지만, 난 그냥 SQL 서버 작업의 상태를 확인하기 위해 필요한 비슷한 상황이 있었다. 많은 사람들은 sysjobactivity 테이블을 언급하고 대단한 MSDN 설명서 지적했다. 그러나, 나는 또한 당신의 서버에 정의 된 모든 작업의 ​​상태를 제공하는 작업 활동 모니터를 강조하고 싶습니다.

  8. ==============================

    8.이 마지막 실행 상태 / 시간이 표시됩니다 또는 실행하는 경우, 그것은 현재 실행 시간을 표시, 스텝 번호 / 정보, 및 SPID (그것은 SPID를 연결 한 경우). 또한 쇼 /가 해결되지 않은 사용자 계정에 대한 NT SID 형식으로 변환 장애인 직업 사용자 수있었습니다.

    이 마지막 실행 상태 / 시간이 표시됩니다 또는 실행하는 경우, 그것은 현재 실행 시간을 표시, 스텝 번호 / 정보, 및 SPID (그것은 SPID를 연결 한 경우). 또한 쇼 /가 해결되지 않은 사용자 계정에 대한 NT SID 형식으로 변환 장애인 직업 사용자 수있었습니다.

    CREATE TABLE #list_running_SQL_jobs
    (
        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
      , request_source INT NOT NULL
      , request_source_id sysname NULL
      , running INT NOT NULL
      , current_step INT NOT NULL
      , current_retry_attempt INT NOT NULL
      , job_state INT NOT NULL
    );
    
    DECLARE @sqluser NVARCHAR(128)
          , @is_sysadmin INT;
    
    SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0);
    
    DECLARE read_sysjobs_for_running CURSOR FOR
        SELECT DISTINCT SUSER_SNAME(owner_sid)FROM msdb.dbo.sysjobs;
    OPEN read_sysjobs_for_running;
    FETCH NEXT FROM read_sysjobs_for_running
    INTO @sqluser;
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO #list_running_SQL_jobs
        EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @sqluser;
        FETCH NEXT FROM read_sysjobs_for_running
        INTO @sqluser;
    END;
    
    CLOSE read_sysjobs_for_running;
    DEALLOCATE read_sysjobs_for_running;
    
    SELECT j.name
         , 'Enbld' = CASE j.enabled
                         WHEN 0
                             THEN 'no'
                         ELSE 'YES'
                     END
         , '#Min' = DATEDIFF(MINUTE, a.start_execution_date, ISNULL(a.stop_execution_date, GETDATE()))
         , 'Status' = CASE
                          WHEN a.start_execution_date IS NOT NULL
                              AND a.stop_execution_date IS NULL
                              THEN 'Executing'
                          WHEN h.run_status = 0
                              THEN 'FAILED'
                          WHEN h.run_status = 2
                              THEN 'Retry'
                          WHEN h.run_status = 3
                              THEN 'Canceled'
                          WHEN h.run_status = 4
                              THEN 'InProg'
                          WHEN h.run_status = 1
                              THEN 'Success'
                          ELSE 'Idle'
                      END
         , r.current_step
         , spid = p.session_id
         , owner = ISNULL(SUSER_SNAME(j.owner_sid), 'S-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1))) - CONVERT(BIGINT, 256) * CONVERT(BIGINT, UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1)) / 256)) + '-' + CONVERT(NVARCHAR(12), UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 4), 1)) / 256 + CONVERT(BIGINT, NULLIF(UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1)) / 256, 0)) - CONVERT(BIGINT, UNICODE(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 1)) / 256)) + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 5), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 6), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 6), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 7), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 8), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 8), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 9), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 10), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 10), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 11), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 12), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 12), -1)) * 0), '') + ISNULL('-' + CONVERT(NVARCHAR(12), CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 13), 1))) + CONVERT(BIGINT, UNICODE(RIGHT(LEFT(CONVERT(NVARCHAR(256), j.owner_sid), 14), 1))) * CONVERT(BIGINT, 65536) + CONVERT(BIGINT, NULLIF(SIGN(LEN(CONVERT(NVARCHAR(256), j.owner_sid)) - 14), -1)) * 0), '')) --SHOW as NT SID when unresolved
         , a.start_execution_date
         , a.stop_execution_date
         , t.subsystem
         , t.step_name
    FROM msdb.dbo.sysjobs j
        LEFT OUTER JOIN (SELECT DISTINCT * FROM #list_running_SQL_jobs) r
            ON j.job_id = r.job_id
        LEFT OUTER JOIN msdb.dbo.sysjobactivity a
            ON j.job_id = a.job_id
                AND a.start_execution_date IS NOT NULL
                --AND a.stop_execution_date IS NULL
                AND NOT EXISTS
                (
                    SELECT *
                    FROM msdb.dbo.sysjobactivity at
                    WHERE at.job_id = a.job_id
                        AND at.start_execution_date > a.start_execution_date
                )
        LEFT OUTER JOIN sys.dm_exec_sessions p
            ON p.program_name LIKE 'SQLAgent%0x%'
                AND j.job_id = SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 7, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 5, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 3, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 1, 2) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 11, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 9, 2) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 15, 2) + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 13, 2) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 17, 4) + '-' + SUBSTRING(SUBSTRING(p.program_name, CHARINDEX('0x', p.program_name) + 2, 32), 21, 12)
        LEFT OUTER JOIN msdb.dbo.sysjobhistory h
            ON j.job_id = h.job_id
                AND h.instance_id = a.job_history_id
        LEFT OUTER JOIN msdb.dbo.sysjobsteps t
            ON t.job_id = j.job_id
                AND t.step_id = r.current_step
    ORDER BY 1;
    
    DROP TABLE #list_running_SQL_jobs;
    
  9. ==============================

    9.나는 msdb.dbo.sysjobactivity에 많은 레코드를 보았다하지만 작업 위의 작업 어디 run_Requested_date가 null가 아닌 및 stop_execution_date은 널 (null)입니다 ---- 및 작업이 현재 실행되고 있지 않습니다.

    나는 msdb.dbo.sysjobactivity에 많은 레코드를 보았다하지만 작업 위의 작업 어디 run_Requested_date가 null가 아닌 및 stop_execution_date은 널 (null)입니다 ---- 및 작업이 현재 실행되고 있지 않습니다.

    나는 (모르겠 음 작업이 시간에 실행되고 있지 확인) 가짜 모든 항목을 삭제하려면 다음 스크립트를 실행 추천 할 것입니다.

    SQL 2008 :

        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  
    
  10. ==============================

    10.실행 올 것이 내 작업의 하나로서 (코드는 위에 나열된 일명) 나는 MSDB 테이블을 쿼리 내 서버 중 하나에 문제로 실행,하지만하지 않았다. 이 시스템 저장 프로 시저가 반환 실행 상태이지만, 하나는 오류없이 간부 문 삽입 할 수 없습니다. 삽입 간부 문을 사용할 수있는 다른 시스템 저장 프로 시저입니다 내부.

    실행 올 것이 내 작업의 하나로서 (코드는 위에 나열된 일명) 나는 MSDB 테이블을 쿼리 내 서버 중 하나에 문제로 실행,하지만하지 않았다. 이 시스템 저장 프로 시저가 반환 실행 상태이지만, 하나는 오류없이 간부 문 삽입 할 수 없습니다. 삽입 간부 문을 사용할 수있는 다른 시스템 저장 프로 시저입니다 내부.

    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) 
    
  11. ==============================

    11.

    SELECT sj.name
      FROM msdb..sysjobactivity aj
      JOIN msdb..sysjobs sj
        on sj.job_id = aj.job_id
     WHERE aj.stop_execution_date  IS NULL     -- job hasn't stopped running
       AND aj.start_execution_date IS NOT NULL -- job is currently running
       AND sj.name = '<your Job Name>'
       AND NOT EXISTS( -- make sure this is the most recent run
                       select 1
                         from msdb..sysjobactivity new
                        where new.job_id = aj.job_id
                          and new.start_execution_date > aj.start_execution_date ) )
    print 'running'
    
  12. ==============================

    12.내가 찾은 가장 간단한 방법은 저장 프로 시저를 만드는 것이 었습니다. '작업 이름'과 히트 이동을 입력합니다.

    내가 찾은 가장 간단한 방법은 저장 프로 시저를 만드는 것이 었습니다. '작업 이름'과 히트 이동을 입력합니다.

    /*-----------------------------------------------------------------------------------------------------------
    
        Document Title: usp_getJobStatus
    
        Purpose:        Finds a Current Jobs Run Status     
        Input Example:  EXECUTE usp_getJobStatus 'MyJobName'
    
    -------------------------------------------------------------------------------------------------------------*/
    
        IF OBJECT_ID ( 'usp_getJobStatus','P' ) IS NOT NULL
        DROP PROCEDURE  usp_getJobStatus;
    
        GO
    
            CREATE PROCEDURE  usp_getJobStatus 
                              @JobName NVARCHAR (1000)
    
        AS
    
            IF OBJECT_ID('TempDB..#JobResults','U') IS NOT NULL DROP TABLE #JobResults
            CREATE TABLE #JobResults ( 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,
                                       Request_Source        INT NOT NULL, 
                                       Request_Source_id     SYSNAME 
                                       COLLATE Database_Default      NULL, 
                                       Running               INT NOT NULL,
                                       Current_Step          INT NOT NULL, 
                                       Current_Retry_Attempt INT NOT NULL, 
                                       Job_State             INT NOT NULL ) 
    
            INSERT  #JobResults 
            EXECUTE master.dbo.xp_sqlagent_enum_jobs 1, '';
    
            SELECT  job.name                                                AS [Job_Name], 
                  ( SELECT  MAX(CAST( STUFF(STUFF(CAST(jh.run_date AS VARCHAR),7,0,'-'),5,0,'-') + ' ' + 
                            STUFF(STUFF(REPLACE(STR(jh.run_time,6,0),' ','0'),5,0,':'),3,0,':') AS DATETIME))
                    FROM    msdb.dbo.sysjobs AS j 
                        INNER JOIN msdb.dbo.sysjobhistory AS jh 
                           ON jh.job_id = j.job_id AND jh.step_id = 0 
                    WHERE j.[name] LIKE '%' + @JobName + '%' 
                    GROUP BY j.[name] )                                     AS [Last_Completed_DateTime], 
                  ( SELECT  TOP 1 start_execution_date 
                    FROM    msdb.dbo.sysjobactivity
                    WHERE   job_id = r.job_id
                    ORDER BY start_execution_date DESC )                    AS [Job_Start_DateTime],
                CASE 
                    WHEN r.running = 0 THEN
                        CASE 
                            WHEN jobInfo.lASt_run_outcome = 0 THEN 'Failed'
                            WHEN jobInfo.lASt_run_outcome = 1 THEN 'Success'
                            WHEN jobInfo.lASt_run_outcome = 3 THEN 'Canceled'
                            ELSE 'Unknown'
                        END
                            WHEN r.job_state = 0 THEN 'Success'
                            WHEN r.job_state = 4 THEN 'Success'
                            WHEN r.job_state = 5 THEN 'Success'
                            WHEN r.job_state = 1 THEN 'In Progress'
                            WHEN r.job_state = 2 THEN 'In Progress'
                            WHEN r.job_state = 3 THEN 'In Progress'
                            WHEN r.job_state = 7 THEN 'In Progress'
                         ELSE 'Unknown' END                                 AS [Run_Status_Description]
            FROM    #JobResults AS r 
                LEFT OUTER JOIN msdb.dbo.sysjobservers AS jobInfo 
                   ON r.job_id = jobInfo.job_id 
                INNER JOIN msdb.dbo.sysjobs AS job 
                   ON r.job_id = job.job_id 
            WHERE   job.[enabled] = 1
                    AND job.name LIKE '%' + @JobName + '%'
    
  13. ==============================

    13.

    ;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)
    
  14. from https://stackoverflow.com/questions/200195/how-can-i-determine-the-status-of-a-job by cc-by-sa and MIT license