Apakah beberapa googling di sekitar dan di sini adalah beberapa perangkat lunak yang mungkin menarik bagi Anda:
SQL Job Manager
https://www.idera.com/productssolutions/freetools/sqljobmanager
Permintaan Saat Ini Menjalankan Pekerjaan Agen SQL Server
http://sqlconcept.com/2011/06/25/how-to-query-currently-running-sql-server-agent-jobs/
Jika ada yang memiliki lebih banyak tautan untuk ditambahkan, silakan!
Untuk poin 3, permintaan tautan dan catatan ada di sini -
Hari ini saya melakukan pencarian untuk menemukan cara untuk mendaftar semua pekerjaan SQL Server Agent yang sedang berjalan. Seperti setiap pencarian lainnya, yang ini juga dimulai dengan Google-ing. :)
Dalam 2 menit saya menemukan posting hebat ini oleh Brent Ozar di SQLServerPedia. Mengapa postingan ini begitu hebat? Ini sangat bagus karena Brent berpikir bahwa jika Anda hanya menanyakan tabel sysjobs dan sysjobhistory, Anda tidak akan mendapatkan status pekerjaan saat ini yang akurat. Yaitu dalam tabel sysjobhistory Anda memiliki kolom run_status, namun (meskipun menurut BOL nilai yang mungkin untuk kolom ini adalah "Status pelaksanaan pekerjaan: 0 = Gagal, 1 = Berhasil, 2 = Coba lagi, 3 = Coba lagi, 3 = Dibatalkan, 4 = Sedang berlangsung ”) pada kenyataannya, nilainya tidak akan pernah menjadi 4 (Sedang Berlangsung). Sebenarnya, dalam tabel sysjobhistory disimpan data historis dari setiap langkah pekerjaan yang dieksekusi, yang berarti bahwa status langkah tersebut diperbarui hanya setelah langkah berikutnya dieksekusi. Dengan kata lain, tabel TIDAK diperbarui secara real time, atau setiap detik lainnya.
Jadi, Brent menemukan bahwa ada prosedur tersimpan yang tidak terdokumentasi sys.xp_sqlagent_enum_jobs, yang merupakan bagian dari sp_help_job, yang dapat memberikan status eksekusi saat ini dari Agent Job.
Meskipun saya menemukan cara untuk mendapatkan pekerjaan yang sedang berjalan, saya tidak senang dengan skrip ini karena hanya berjalan pada SQL 2005/2008.
Apa yang harus saya lakukan jika saya memiliki contoh SQL 2000 dan saya sangat ingin tahu tentang pekerjaan yang sedang berjalan?
Dengan sedikit bantuan Tim Chapman (master www.SQLServerNation.com), saya menemukan cara untuk melakukannya. TERIMA KASIH, Tim!
Berikut ini adalah skrip final, yang akan berjalan pada SQL 2000, 2005 dan 2008, dan yang akan memberi Anda pekerjaan agen SQL Server yang sedang berjalan. (Seperti yang Anda lihat, perbedaan dengan skrip Brent sangat sedikit: alih-alih “sys.xp_sqlagent_enum_jobs” Saya menggunakan “master.dbo.xp_sqlagent_enum_jobs” dan saya membatasi resultset untuk mendapatkan hanya pekerjaan yang sedang berjalan dengan menggunakan “where x .running = 1 ″).
Sederhana seperti itu. Nikmati.
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