I know you don't want to see or hear from me but here is an alternative solution to yours:
SELECT
j.name,
msdb.dbo.Agent_datetime(h.run_date, h.run_time) AS Run_Datetime,
dateadd(second, ((h.run_duration / 10000) * 3600) + (((h.run_duration / 100) % 60) * 60) + (h.run_duration % 60), msdb.dbo.Agent_datetime(h.run_date, h.run_time)) as Run_EndDate,
Stuff(Stuff(RIGHT('000000' + Cast(h.run_duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') as RunDuration,
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,
h.message,
h.step_id
FROM
msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobhistory h
ONh.job_id = j.job_id
order by
j.name,
h.run_date,
h.step_id
Test Harness used:
set nocount on;
GO
Print '------------ Welsh Corgi version ------------';
GO
--===== Create the timer and bit-bucket variables and start the timer.
DECLARE @Bitbucket sysname; --< change or add variables needed here to eliminate display distortion
Declare @cpu_ int,
@lreads_ bigint,
@eMsec_ bigint,
@Reads_ bigint,
@Writes_ bigint;
declare @CpuMs int,
@LogRds bigint,
@Elapsed bigint,
@Reads bigint,
@Writes bigint;
dbcc freeproccache with no_infomsgs;
dbcc freesystemcache('ALL') with no_infomsgs;
dbcc dropcleanbuffers with no_infomsgs;
Select
@cpu_ = cpu_time
, @lreads_ = logical_reads
, @eMsec_ = total_elapsed_time
, @Reads_ = reads
, @Writes_ = writes
From
sys.dm_exec_requests
Where
session_id = @@spid;
---
SELECT DISTINCT
j.Name AS Job_Name,
msdb.dbo.Agent_datetime(Run_Date, Run_Time) AS Run_Datetime,
Dateadd(second, Datediff(second, 0, msdb.dbo.Agent_datetime(19000101, Run_Duration)), msdb.dbo.Agent_datetime(Run_Date, Run_Time)) AS Run_Endtime,
Stuff(Stuff(RIGHT('000000' + Cast(Run_Duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS Run_Duration,
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,
h.Message ,
h.Step_ID AS Step_ID
FROM
msdb.dbo.Sysjobhistory h
INNER JOIN msdb.dbo.Sysjobs j
ON h.Job_id = j.Job_id
INNER JOIN msdb.dbo.sysjobsteps js
ON js.job_id = j.job_id
option (maxdop 1)
---
Select
@CpuMs = cpu_time - @cpu_
, @LogRds = logical_reads - @lreads_
, @Elapsed = total_elapsed_time - @eMsec_
, @Reads = reads - @Reads_
, @Writes = writes - @Writes_
From
sys.dm_exec_requests
Where
session_id = @@spid;
--===== Display the duration
PRINT 'Cold cache';
PRINT 'CPU(ms): ' + right(' ' + cast(@CpuMs as varchar(10)),10) +
' Logical Reads: ' + right(' ' + cast(@LogRds as varchar(10)),10) +
' Elapsed(ms): ' + right(' ' + cast(@Elapsed as varchar(10)),10) +
' Reads: ' + right(' ' + cast(@Reads as varchar(10)),10) +
' Writes: ' + right(' ' + cast(@Writes as varchar(10)),10);
go
PRINT 'Warm cache';
GO
Declare @cpu_ int,
@lreads_ bigint,
@eMsec_ bigint,
@Reads_ bigint,
@Writes_ bigint;
declare @CpuMs int,
@LogRds bigint,
@Elapsed bigint,
@Reads bigint,
@Writes bigint;
Select
@cpu_ = cpu_time
, @lreads_ = logical_reads
, @eMsec_ = total_elapsed_time
, @Reads_ = reads
, @Writes_ = writes
From
sys.dm_exec_requests
Where
session_id = @@spid;
---
SELECT DISTINCT
j.Name AS Job_Name,
msdb.dbo.Agent_datetime(Run_Date, Run_Time) AS Run_Datetime,
Dateadd(second, Datediff(second, 0, msdb.dbo.Agent_datetime(19000101, Run_Duration)), msdb.dbo.Agent_datetime(Run_Date, Run_Time)) AS Run_Endtime,
Stuff(Stuff(RIGHT('000000' + Cast(Run_Duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS Run_Duration,
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,
h.Message ,
h.Step_ID AS Step_ID
FROM
msdb.dbo.Sysjobhistory h
INNER JOIN msdb.dbo.Sysjobs j
ON h.Job_id = j.Job_id
INNER JOIN msdb.dbo.sysjobsteps js
ON js.job_id = j.job_id
option (maxdop 1)
---
Select
@CpuMs = cpu_time - @cpu_
, @LogRds = logical_reads - @lreads_
, @Elapsed = total_elapsed_time - @eMsec_
, @Reads = reads - @Reads_
, @Writes = writes - @Writes_
From
sys.dm_exec_requests
Where
session_id = @@spid;
--===== Display the duration
PRINT 'CPU(ms): ' + right(' ' + cast(@CpuMs as varchar(10)),10) +
' Logical Reads: ' + right(' ' + cast(@LogRds as varchar(10)),10) +
' Elapsed(ms): ' + right(' ' + cast(@Elapsed as varchar(10)),10) +
' Reads: ' + right(' ' + cast(@Reads as varchar(10)),10) +
' Writes: ' + right(' ' + cast(@Writes as varchar(10)),10);
go 10
set nocount off;
GO
set nocount on;
GO
Print '------------ Alternative version ------------';
GO
--===== Create the timer and bit-bucket variables and start the timer.
DECLARE @Bitbucket sysname; --< change or add variables needed here to eliminate display distortion
Declare @cpu_ int,
@lreads_ bigint,
@eMsec_ bigint,
@Reads_ bigint,
@Writes_ bigint;
declare @CpuMs int,
@LogRds bigint,
@Elapsed bigint,
@Reads bigint,
@Writes bigint;
dbcc freeproccache with no_infomsgs;
dbcc freesystemcache('ALL') with no_infomsgs;
dbcc dropcleanbuffers with no_infomsgs;
Select
@cpu_ = cpu_time
, @lreads_ = logical_reads
, @eMsec_ = total_elapsed_time
, @Reads_ = reads
, @Writes_ = writes
From
sys.dm_exec_requests
Where
session_id = @@spid;
---
SELECT
j.name,
msdb.dbo.Agent_datetime(h.run_date, h.run_time) AS Run_Datetime,
dateadd(second, ((h.run_duration / 10000) * 3600) + (((h.run_duration / 100) % 60) * 60) + (h.run_duration % 60), msdb.dbo.Agent_datetime(h.run_date, h.run_time)) as Run_EndDate,
Stuff(Stuff(RIGHT('000000' + Cast(h.run_duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') as RunDuration,
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,
h.message,
h.step_id
FROM
msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobhistory h
ONh.job_id = j.job_id
order by
j.name,
h.run_date,
h.step_id
option (maxdop 1)
---
Select
@CpuMs = cpu_time - @cpu_
, @LogRds = logical_reads - @lreads_
, @Elapsed = total_elapsed_time - @eMsec_
, @Reads = reads - @Reads_
, @Writes = writes - @Writes_
From
sys.dm_exec_requests
Where
session_id = @@spid;
--===== Display the duration
PRINT 'Cold cache';
PRINT 'CPU(ms): ' + right(' ' + cast(@CpuMs as varchar(10)),10) +
' Logical Reads: ' + right(' ' + cast(@LogRds as varchar(10)),10) +
' Elapsed(ms): ' + right(' ' + cast(@Elapsed as varchar(10)),10) +
' Reads: ' + right(' ' + cast(@Reads as varchar(10)),10) +
' Writes: ' + right(' ' + cast(@Writes as varchar(10)),10);
go
PRINT 'Warm cache';
go
Declare @cpu_ int,
@lreads_ bigint,
@eMsec_ bigint,
@Reads_ bigint,
@Writes_ bigint;
declare @CpuMs int,
@LogRds bigint,
@Elapsed bigint,
@Reads bigint,
@Writes bigint;
Select
@cpu_ = cpu_time
, @lreads_ = logical_reads
, @eMsec_ = total_elapsed_time
, @Reads_ = reads
, @Writes_ = writes
From
sys.dm_exec_requests
Where
session_id = @@spid;
---
SELECT
j.name,
msdb.dbo.Agent_datetime(h.run_date, h.run_time) AS Run_Datetime,
dateadd(second, ((h.run_duration / 10000) * 3600) + (((h.run_duration / 100) % 60) * 60) + (h.run_duration % 60), msdb.dbo.Agent_datetime(h.run_date, h.run_time)) as Run_EndDate,
Stuff(Stuff(RIGHT('000000' + Cast(h.run_duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') as RunDuration,
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,
h.message,
h.step_id
FROM
msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobhistory h
ONh.job_id = j.job_id
order by
j.name,
h.run_date,
h.step_id
option (maxdop 1)
---
Select
@CpuMs = cpu_time - @cpu_
, @LogRds = logical_reads - @lreads_
, @Elapsed = total_elapsed_time - @eMsec_
, @Reads = reads - @Reads_
, @Writes = writes - @Writes_
From
sys.dm_exec_requests
Where
session_id = @@spid;
--===== Display the duration
PRINT 'CPU(ms): ' + right(' ' + cast(@CpuMs as varchar(10)),10) +
' Logical Reads: ' + right(' ' + cast(@LogRds as varchar(10)),10) +
' Elapsed(ms): ' + right(' ' + cast(@Elapsed as varchar(10)),10) +
' Reads: ' + right(' ' + cast(@Reads as varchar(10)),10) +
' Writes: ' + right(' ' + cast(@Writes as varchar(10)),10);
go 10
set nocount off;
GO
Results on my system:
------------ Welsh Corgi version ------------
Cold cache
CPU(ms): 16 Logical Reads: 646 Elapsed(ms): 162 Reads: 247 Writes: 0
Warm cache
Beginning execution loop
CPU(ms): 0 Logical Reads: 441 Elapsed(ms): 8 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 441 Elapsed(ms): 7 Reads: 0 Writes: 0
CPU(ms): 15 Logical Reads: 441 Elapsed(ms): 7 Reads: 0 Writes: 0
CPU(ms): 16 Logical Reads: 441 Elapsed(ms): 7 Reads: 0 Writes: 0
CPU(ms): 16 Logical Reads: 441 Elapsed(ms): 8 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 441 Elapsed(ms): 8 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 441 Elapsed(ms): 7 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 441 Elapsed(ms): 8 Reads: 0 Writes: 0
CPU(ms): 15 Logical Reads: 441 Elapsed(ms): 8 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 441 Elapsed(ms): 7 Reads: 0 Writes: 0
Batch execution completed 10 times.
------------ Alternative version ------------
Cold cache
CPU(ms): 0 Logical Reads: 351 Elapsed(ms): 15 Reads: 207 Writes: 0
Warm cache
Beginning execution loop
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 1 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 1 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 1 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
CPU(ms): 0 Logical Reads: 225 Elapsed(ms): 2 Reads: 0 Writes: 0
Batch execution completed 10 times.