SQL Server – How to Get Job Start Time Inside a TSQL Agent Job Step

sql serversql server 2014sql-server-agent

Is there a good way to query the job start time inside of a given sql agent job step (TSQL)? This will help with step 3 in the following scenario.

Job Foo (Run Daily @ 11:30pm)
Step1 – StartTime = Saturday 11:30pm TSQL – (15 minute duration)
Step2 – StartTime = Saturday 11:45pm TSQL – (30 minute duration)
Step3 – StartTime = Sunday 12:15am TSQL – Exit early / don't run unless Foo job was started on a Saturday.

Best Answer

Here's a script to build a view that shows current job's run status and current step.

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE OR ALTER   PROCEDURE ETLSteps.ListJobsCurrentRunningStatus 
AS
BEGIN
    SET NOCOUNT ON
    SET ANSI_WARNINGS OFF
    DECLARE @currentjobstatus TABLE([Job ID] binary(16), [Last Run Date] int, [Last Run Time] int, [Next Run Date] int, [Next Run Time] int, [Next Run Schedule ID] int, [Requested To Run] int, [Request Source] int, [Request Source ID] nvarchar(66), [Running] int, [Current Step] int, [Current Retry Attempt] int, [State] int )
    INSERT INTO @currentjobstatus
    EXEC master.dbo.xp_sqlagent_enum_jobs 1, ''
    SELECT job_id_bin = [Job ID], job_is_running = Running, current_step_id = [Current Step], current_step_retry_attempt_no = [Current Retry Attempt], current_run_status = State FROM @currentjobstatus
    RETURN 0
    DECLARE @rtn int
    EXEC @rtn =  ETLSteps.ListJobsCurrentRunningStatus 
END
GO

EXEC master.dbo.sp_addlinkedserver @server = N'.\instance', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'.\instance',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'rpc', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'rpc out', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'sub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'connect timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'collation name', @optvalue=NULL
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'lazy schema validation', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'query timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'.\instance', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

CREATE OR ALTER VIEW ETLSteps.AgentJobsCurrentlyRunning AS
SELECT 
    job_id = CAST(job_id_bin AS UNIQUEIDENTIFIER)
,   job_id_bin
,   job_is_running 
,   current_step_id 
,   current_step_retry_attempt_no
,   current_run_status 
FROM OPENQUERY([.\instance], 'DBABnch_Local.ETLSteps.ListJobsCurrentRunningStatus') query
GO
SELECT * FROM ETLSteps.AgentJobsCurrentlyRunning