comment écrire un script pour voir les travaux en cours d'exécution dans SQL Server avec l'heure de début du travail?
SELECT sj.name,
sja.run_requested_date,
CONVERT(VARCHAR(12), sja.stop_execution_date-sja.start_execution_date, 114) Duration
FROM msdb.dbo.sysjobactivity sja
INNER JOIN msdb.dbo.sysjobs sj
ON sja.job_id = sj.job_id
WHERE sja.run_requested_date IS NOT NULL
ORDER BY sja.run_requested_date desc;
J'ai posté une requête il y a quelque temps pour obtenir une liste des travaux en cours d'exécution ici .
SELECT
ja.job_id,
j.name AS job_name,
ja.start_execution_date,
ISNULL(last_executed_step_id,0)+1 AS current_executed_step_id,
Js.step_name
FROM msdb.dbo.sysjobactivity ja
LEFT JOIN msdb.dbo.sysjobhistory jh
ON ja.job_history_id = jh.instance_id
JOIN msdb.dbo.sysjobs j
ON ja.job_id = j.job_id
JOIN msdb.dbo.sysjobsteps js
ON ja.job_id = js.job_id
AND ISNULL(ja.last_executed_step_id,0)+1 = js.step_id
WHERE ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
AND start_execution_date is not null
AND stop_execution_date is null;
Cela a le nom du travail, l'ID du travail, l'heure de début et l'étape à laquelle il s'exécute. Si vous suivez le lien ci-dessus, vous pouvez obtenir plus de détails sur la façon dont je l'ai conçu et sur les autres options disponibles.
J'ai rencontré des problèmes sur l'un de mes serveurs pour interroger les tables MSDB (alias le code répertorié ci-dessus) car l'un de mes travaux était en cours d'exécution, mais ce n'était pas le cas. Il existe une procédure stockée système qui renvoie l'état d'exécution, mais on ne peut pas faire une instruction d'insertion exec sans erreur. À l'intérieur se trouve une autre procédure stockée système qui peut être utilisée avec une instruction insert exec.
INSERT INTO #Job
EXEC master.dbo.xp_sqlagent_enum_jobs 1,dbo
Et la table pour le charger dans:
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)
Cela vous donnera le nom du travail et la date et l'heure d'exécution, vous pouvez supprimer la date si vous voulez simplement voir le nom et l'heure d'exécution.
SELECT
j.name AS 'JobName',
run_date,
run_time,
msdb.dbo.agent_datetime(run_date, run_time) AS 'RunDateTime'
FROM msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.enabled = 1 --Only Enabled Jobs
ORDER BY JobName, RunDateTime desc
Ce script affichera les travaux en cours d'exécution, ainsi que l'étape en cours d'exécution:
-- From http://www.databasejournal.com/features/mssql/article.php/10894_3491201_2/Detecting-The-State-of-a-SQL-Server-Agent-Job.htm
CREATE TABLE #ENUM_JOB
(
Job_ID UNIQUEIDENTIFIER,
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 VARCHAR(100),
Running INT,
Current_Step INT,
Current_Retry_Attempt INT,
State INT
)
INSERT INTO #ENUM_JOB
EXEC master.dbo.xp_sqlagent_enum_jobs 1,garbage
SELECT E.*, SJ.name AS job_name, SJS.step_name
FROM #ENUM_JOB AS E
JOIN msdb.dbo.sysjobs AS SJ
ON SJ.job_id = E.Job_ID
JOIN msdb.dbo.sysjobsteps AS SJS
ON SJS.job_id = SJ.job_id
AND SJS.step_id = E.Current_Step
DROP TABLE #ENUM_JOB
Le script suivant renvoie:
SELECT sj.name
, sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
AND sja.stop_execution_date IS NULL
C'est peut-être un peu autour des maisons mais ça fait l'affaire
;WITH cJobDetail AS (
SELECT
ja.job_id
,j.name
,ja.start_execution_date
,ja.last_executed_step_id
--,j.start_step_id
,CASE
WHEN j.start_step_id = COALESCE(ja.last_executed_step_id,j.start_step_id) THEN j.start_step_id
ELSE NULL
END AS ExecutingStepId
,ja.job_history_id
,DATEDIFF(HOUR, ja.start_execution_date, COALESCE(ja.stop_execution_date,SYSDATETIME())) AS JobHourRunning
,DATEDIFF(SECOND, ja.start_execution_date, COALESCE(ja.stop_execution_date,SYSDATETIME())) / 60 % 60 AS JobMinuteRunning
,DATEDIFF(SECOND, ja.start_execution_date, COALESCE(ja.stop_execution_date,SYSDATETIME())) % 60 AS JobSecondRunning
FROM dbo.sysjobactivity ja
INNER JOIN dbo.sysjobs j
ON ja.job_id = j.job_id
WHERE ja.start_execution_date IS NOT NULL
AND ja.stop_execution_date IS NULL
)
,MaxJobHistoryStepStatus AS (
SELECT jh.job_id, jh.step_id, MAX(jh.instance_id) AS MaxInstanceId
FROM cJobDetail jd
INNER JOIN dbo.sysjobhistory jh
ON jd.job_id = jh.job_id
AND jd.last_executed_step_id = jh.step_id
GROUP BY jh.job_id, jh.step_id
)
SELECT
jd.job_id
,jd.name
,jd.start_execution_date
,COALESCE(
CASE jh.run_status
WHEN 1 THEN
CASE js.on_success_action
WHEN 3 THEN jd.last_executed_step_id + 1
WHEN 4 THEN js.on_success_step_id
END
WHEN 0 THEN
CASE js.on_fail_action
WHEN 3 THEN jd.last_executed_step_id + 1
WHEN 4 THEN js.on_fail_step_id
END
END,jd.ExecutingStepId) AS StepId
,jd.JobHourRunning
,jd.JobMinuteRunning
,jd.JobSecondRunning
FROM cJobDetail jd
LEFT JOIN MaxJobHistoryStepStatus mhs
ON jd.job_id = mhs.job_id
LEFT JOIN dbo.sysjobhistory jh
ON mhs.MaxInstanceId = jh.instance_id
LEFT JOIN dbo.sysjobsteps js
ON mhs.job_id = js.job_id
AND mhs.step_id = js.step_id