Technical Article

Show Job Run Snapshot

,

This proc needs only two paramaters, the start and end date of the period.

If you leave them blank, it will select all of the available items.

EXEC dbo.spShowJobRunSnapshot

'9/16/2012',

'9/16/2012 23:59'

CREATE PROCEDURE dbo.spShowJobRunSnapshot
    @dtStart DATETIME = NULL,
    @dtEnd   DATETIME = NULL
AS
/***********************************************************************************************************
 Purpose:      Show a snapshot of all of the jobs running in a proscribed period of time.
 
 Created Date: 8/1/2012
 Written by:   Monte Kottman

 Proc Name:    spShowJobRunSnapshot

 Owner:        

 Inputs:       dtStart - Starting date/time of the period.
               dtEnd   - Ending date/time of the period.

 Outputs:      recordset.

 Dependencies: none

 Tested on:    SQL Server 2000, 2005, 2008, 2012

 Usage:        Standalone
 
 Example:      EXEC dbo.spShowJobRunSnapshot '9/16/2012', '9/16/2012 23:59'

***********************************************************************************************************/SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
                                                          /***********************
                                                          ** Declare supporting data structures
                                                         ***********************/SET NOCOUNT ON

DECLARE 
   @iReturn     INT,
   @sTask       VARCHAR(2000),
   @idCurrent   UNIQUEIDENTIFIER,
   @iRowCnt     INT,
   @iMaxRows    INT 

DECLARE @Hist TABLE 
  ( 
  iRowNum   INT IDENTITY (1, 1) PRIMARY KEY NOT NULL , 
  idCurrent UNIQUEIDENTIFIER
  ) 

CREATE TABLE #tblRunDate 
   (
   idJob        UNIQUEIDENTIFIER, 
   iInstance    INT, 
   sMessage     VARCHAR(200), 
   iRunDate     INT, 
   iRunTime     INT, 
   iRunDuration INT,
   dtRunStart   DATETIME,
   dtRunEnd     DATETIME
   )

SELECT @iRowCnt = 1 

IF LEN(ISNULL(@dtStart,'')) = 0 
   SET @dtStart = (SELECT SUBSTRING(CONVERT(VARCHAR(8),MIN(run_date)),5,2) + '/' +        
   SUBSTRING(CONVERT(VARCHAR(8),MIN(run_date)),7,2) + '/' +        
   SUBSTRING(CONVERT(VARCHAR(8),MIN(run_date)),1,4) FROM msdb.dbo.sysjobhistory)

IF LEN(ISNULL(@dtEnd,'')) = 0 
   SET @dtEnd = (SELECT SUBSTRING(CONVERT(VARCHAR(8),MAX(run_date)),5,2) + '/' +        
   SUBSTRING(CONVERT(VARCHAR(8),MAX(run_date)),7,2) + '/' +        
   SUBSTRING(CONVERT(VARCHAR(8),MAX(run_date)),1,4) FROM msdb.dbo.sysjobhistory)

INSERT INTO @Hist (idCurrent) 
    SELECT 
       O.job_id
    FROM 
       msdb.dbo.sysjobs AS O
       
SELECT @iMaxRows = COUNT(*) FROM @Hist 

WHILE @iRowCnt <= @iMaxRows 
BEGIN 
    SELECT @idCurrent = idCurrent FROM @Hist WHERE iRowNum = @iRowCnt 

    SET @sTask  = ' INSERT #tblRunDate (idJob, iInstance, sMessage, iRunDate, iRunTime, iRunDuration)'
              + ' SELECT TOP 1000 job_id, instance_id, SUBSTRING(message,1,CHARINDEX(' + '''.'''+ ',message,1)), run_date, run_time, run_duration'
              + ' FROM msdb.dbo.sysjobhistory'
              + ' WHERE step_id = 0 AND CONVERT(VARCHAR(100),job_id) = ''' + CONVERT(VARCHAR(100),@idCurrent) + ''''
              + ' ORDER BY instance_id DESC'

    EXECUTE (@sTask)

    SELECT @iRowCnt = @iRowCnt + 1 
END

UPDATE #tblRunDate 
SET dtRunStart = 
      SUBSTRING(CONVERT(VARCHAR(8),iRunDate),5,2) + '/' +        
      SUBSTRING(CONVERT(VARCHAR(8),iRunDate),7,2) + '/' +        
      SUBSTRING(CONVERT(VARCHAR(8),iRunDate),1,4)+ '  ' + 
      ISNULL(SUBSTRING(CONVERT(VARCHAR(7),iRunTime+1000000),2,2) + ':' +        
      SUBSTRING(CONVERT(VARCHAR(7),iRunTime+1000000),4,2) + ':' +        
      SUBSTRING(CONVERT(VARCHAR(7),iRunTime+1000000),6,2),'')

UPDATE #tblRunDate 
   SET dtRunEnd =  dateadd(ss,CAST(SUBSTRING(CONVERT(VARCHAR(7),iRunDuration+1000000),6,2) AS INT),dtRunStart)
WHERE 
   SUBSTRING(CONVERT(VARCHAR(7),iRunDuration+1000000),6,2) IS NOT NULL

UPDATE #tblRunDate 
   SET dtRunEnd =  dateadd(mi,CAST(SUBSTRING(CONVERT(VARCHAR(7),iRunDuration+1000000),4,2) AS INT),dtRunEnd)
WHERE 
   SUBSTRING(CONVERT(VARCHAR(7),iRunDuration+1000000),4,2) IS NOT NULL

UPDATE #tblRunDate 
   SET dtRunEnd =  dateadd(hh,CAST(SUBSTRING(CONVERT(VARCHAR(7),iRunDuration+1000000),2,2) AS INT),dtRunEnd)
WHERE 
   SUBSTRING(CONVERT(VARCHAR(7),iRunDuration+1000000),2,2) IS NOT NULL

SELECT 
   O.name AS [Name], 
   dtRunStart AS [Start Date], 
   ISNULL(SUBSTRING(CONVERT(VARCHAR(7),T.iRunDuration+1000000),2,2) + ':' +        
      SUBSTRING(CONVERT(VARCHAR(7),T.iRunDuration+1000000),4,2) + ':'+        
      SUBSTRING(CONVERT(VARCHAR(7),T.iRunDuration+1000000),6,2),'') AS [Duration], 
   ISNULL(T.sMessage,'') AS [Status],
   dtrunend AS [End Date]
FROM 
   msdb.dbo.sysjobs AS O
   LEFT JOIN #tblRunDate AS T ON O.Job_id = T.idJob
WHERE 
   (dtRunStart BETWEEN @dtStart AND @dtEnd) OR
   (dtRunEnd BETWEEN @dtStart AND @dtEnd) OR 
   (dtRunStart < @dtStart AND dtRunEnd > @dtEnd) OR
   (dtRunStart < @dtStart AND dtRunEnd BETWEEN @dtStart AND @dtEnd) OR
   (dtRunEnd > @dtEnd AND dtRunStart BETWEEN @dtStart AND @dtEnd)   
ORDER BY 
   dtRunStart,
   O.name,
   T.iInstance DESC

DROP TABLE #tblRunDate

Rate

4 (1)

You rated this post out of 5. Change rating

Share

Share

Rate

4 (1)

You rated this post out of 5. Change rating