Haben Sie ein bisschen gegoogelt und hier ist eine Software, die Sie interessieren könnte:
SQL Job Manager
https://www.idera.com/productssolutions/freetools/sqljobmanager
Abfrage, die zurzeit SQL Server-Agent-Jobs
ausführt http://sqlconcept.com/2011/06/25/how-to-query-currently-running-sql-server-agent-jobs/
Wenn jemand mehr Links zum Hinzufügen hat, mach weiter!
Für Punkt 3 sind die Link-Abfrage und Notizen hier -
Heute habe ich nach einer Möglichkeit gesucht, alle derzeit ausgeführten SQL Server-Agent-Jobs aufzulisten. Wie jede andere Suche begann auch diese mit Google-ing. :)
Innerhalb von 2 Minuten fand ich diesen tollen Beitrag von Brent Ozar auf SQLServerPedia. Warum ist dieser Beitrag so toll? Es ist so großartig, weil Brent dachte, wenn Sie nur die sysjobs- und die sysjobhistory-Tabellen abfragen, erhalten Sie keinen genauen aktuellen Jobstatus. Dh in der Tabelle sysjobhistory haben Sie eine Spalte run_status (obwohl laut BOL die möglichen Werte für diese Spalte "Status der Jobausführung" lauten: 0 = Fehlgeschlagen, 1 = Erfolgreich, 2 = Wiederholen, 3 = Abgebrochen, 4 = In Bearbeitung ”) in Wirklichkeit wird der Wert niemals 4 (In Bearbeitung) sein. Tatsächlich werden in der Sysjobhistory-Tabelle Verlaufsdaten jedes ausgeführten Auftragsschritts gespeichert, was bedeutet, dass der Status des Schritts erst aktualisiert wird, nachdem der nächste Schritt ausgeführt wurde. Mit anderen Worten, die Tabelle wird weder in Echtzeit noch jede zweite Sekunde aktualisiert.
Also fand Brent heraus, dass es eine undokumentierte gespeicherte Prozedur sys.xp_sqlagent_enum_jobs gibt, die Teil von sp_help_job ist und den aktuellen Ausführungsstatus des Agent-Jobs liefern kann.
Obwohl ich eine Möglichkeit gefunden habe, die aktuell ausgeführten Jobs abzurufen, war ich mit diesem Skript nicht zufrieden, da es nur unter SQL 2005/2008 ausgeführt wird.
Was kann ich tun, wenn ich eine SQL 2000-Instanz besitze und neugierig auf die aktuell ausgeführten Jobs bin?
Mit ein bisschen Hilfe von Tim Chapman (dem Meister von www.SQLServerNation.com) habe ich herausgefunden, wie es geht. DANKE, Tim!
Hier ist das letzte Skript, das unter SQL 2000, 2005 und 2008 ausgeführt wird und das Ihnen die aktuell ausgeführten SQL Server-Agentenaufträge liefert. (Wie Sie sehen, ist der Unterschied zu Brents Skript sehr gering: Anstelle von "sys.xp_sqlagent_enum_jobs" verwende ich "master.dbo.xp_sqlagent_enum_jobs" und beschränke die Ergebnismenge, um nur die aktuell ausgeführten Jobs zu erhalten, indem "where x" verwendet wird .running = 1 ").
Einfach wie es ist. Genießen.
IF EXISTS (SELECT *
FROM tempdb.dbo.sysobjects
WHERE id = OBJECT_ID(N'[tempdb].[dbo].[Temp1]')
)
DROP TABLE [tempdb].[dbo].[Temp1]
GO
CREATE TABLE [tempdb].[dbo].[Temp1]
(
job_id uniqueidentifier NOT NULL,
last_run_date nvarchar (20) NOT NULL,
last_run_time nvarchar (20) NOT NULL,
next_run_date nvarchar (20) NOT NULL,
next_run_time nvarchar (20) NOT NULL,
next_run_schedule_id INT NOT NULL,
requested_to_run INT NOT NULL,
request_source INT NOT NULL,
request_source_id sysname
COLLATE database_default NULL,
running INT NOT NULL,
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL)
DECLARE @job_owner sysname
DECLARE @is_sysadmin INT
SET @is_sysadmin = isnull (is_srvrolemember ('sysadmin'), 0)
SET @job_owner = suser_sname ()
INSERT INTO [tempdb].[dbo].[Temp1]
--EXECUTE sys.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner
EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner
UPDATE [tempdb].[dbo].[Temp1]
SET last_run_time = right ('000000' + last_run_time, 6),
next_run_time = right ('000000' + next_run_time, 6);
-----
SELECT j.name AS JobName,
j.enabled AS Enabled,
CASE x.running
WHEN 1
THEN
'Running'
ELSE
CASE h.run_status
WHEN 2 THEN 'Inactive'
WHEN 4 THEN 'Inactive'
ELSE 'Completed'
END
END
AS CurrentStatus,
coalesce (x.current_step, 0) AS CurrentStepNbr,
CASE
WHEN x.last_run_date > 0
THEN
convert (datetime,
substring (x.last_run_date, 1, 4)
+ '-'
+ substring (x.last_run_date, 5, 2)
+ '-'
+ substring (x.last_run_date, 7, 2)
+ ' '
+ substring (x.last_run_time, 1, 2)
+ ':'
+ substring (x.last_run_time, 3, 2)
+ ':'
+ substring (x.last_run_time, 5, 2)
+ '.000',
121
)
ELSE
NULL
END
AS LastRunTime,
CASE h.run_status
WHEN 0 THEN 'Fail'
WHEN 1 THEN 'Success'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Cancel'
WHEN 4 THEN 'In progress'
END
AS LastRunOutcome,
CASE
WHEN h.run_duration > 0
THEN
(h.run_duration / 1000000) * (3600 * 24)
+ (h.run_duration / 10000 % 100) * 3600
+ (h.run_duration / 100 % 100) * 60
+ (h.run_duration % 100)
ELSE
NULL
END
AS LastRunDuration
FROM [tempdb].[dbo].[Temp1] x
LEFT JOIN
msdb.dbo.sysjobs j
ON x.job_id = j.job_id
LEFT OUTER JOIN
msdb.dbo.syscategories c
ON j.category_id = c.category_id
LEFT OUTER JOIN
msdb.dbo.sysjobhistory h
ON x.job_id = h.job_id
AND x.last_run_date = h.run_date
AND x.last_run_time = h.run_time
AND h.step_id = 0
where x.running = 1