SELECT j.job_id , j.name FROM msdb..sysjobs j WHERE EXISTS ( SELECT 1 FROM msdb..sysjobsteps sj INNER JOIN msdb..sysjobactivity ja ON ja.job_id = j.job_id WHERE sj.job_id = j.job_id AND ja.start_execution_date <= GETDATE() AND ja.stop_execution_date IS NULL AND ja.session_id = ( SELECT MAX(ja2.session_id) FROM msdb..sysjobactivity ja2 WHERE ja2.job_id = j.job_id ) )
另一个,SYE.DM_EXEC_SESSIONS:
SELECT j.job_id, j.name FROM msdb..sysjobs j WHERE dbo.uf_HexToChar(j.job_id, 16) IN ( SELECT SUBSTRING(sp.[program_name], 32, 32) FROM sys.dm_exec_sessions sp WHERE sp.status IN ( 'running', 'sleeping' )
上面有个自定义函数:
CREATE FUNCTION [dbo].[uf_HexToChar] ( @binaryValue VARBINARY(100) , @numBytes INT ) RETURNS VARCHAR(200) AS BEGIN DECLARE @i VARBINARY(10) , @hexdigits CHAR(16) , @s VARCHAR(100) , @h VARCHAR(100) , @currentByte SMALLINT SET @hexdigits = '0123456789ABCDEF' SET @currentByte = 0 SET @h = '' -- process all bytes WHILE @currentByte < @numBytes BEGIN SET @currentByte = @currentByte + 1 -- get first character of byte SET @i = SUBSTRING(CAST(@binaryValue AS VARBINARY(100)), @currentByte, 1) -- get the first character SET @s = CAST(SUBSTRING(@hexdigits, @i % 16 + 1, 1) AS CHAR(1)) -- shift over one character SET @i = @i / 16 -- get the second character SET @s = CAST(SUBSTRING(@hexdigits, @i % 16 + 1, 1) AS CHAR(1)) + @s -- build string of hex characters SET @h = @h + @s END RETURN(@h) END GO