Có một số googling xung quanh và đây là một số phần mềm có thể bạn quan tâm:
Trình quản lý công việc SQL
https://www.idera.com/productssolutions/freetools/sqljobmanager
Truy vấn Hiện đang chạy Công việc Tác nhân Máy chủ SQL
http://sqlconcept.com/2011/06/25/how-to-query-civersely-rucky-sql-server-agent-jobs/
Nếu bất cứ ai có nhiều liên kết để thêm, hãy tiếp tục!
Đối với điểm 3, truy vấn liên kết và ghi chú ở đây -
Hôm nay tôi đã thực hiện một nhiệm vụ để khám phá một cách liệt kê tất cả các công việc SQL Server Agent hiện đang chạy. Như mọi nhiệm vụ khác, nhiệm vụ này cũng bắt đầu với Google-ing. :)
Trong vòng 2 phút, tôi đã tìm thấy bài đăng tuyệt vời này của Brent Ozar trên SQLServerPedia. Tại sao bài này rất tuyệt? Thật tuyệt vời vì Brent đã hình dung rằng nếu bạn chỉ truy vấn các sysjobs và các bảng sysjobhistory thì bạn sẽ không có được trạng thái công việc hiện tại chính xác. Tuy nhiên, trong bảng sysjobhistory, bạn có một cột run_status, tuy nhiên (mặc dù theo BOL, các giá trị có thể có cho cột này là Trạng thái thực thi công việc: 0 = Thất bại, 1 = Thành công, 2 = Thử lại, 3 = Hủy, 4 = Trong tiến trình trực tiếp) trong thực tế, giá trị sẽ không bao giờ là 4 (Đang tiến hành). Trên thực tế, trong bảng sysjobhistory được lưu giữ dữ liệu lịch sử của từng bước công việc, có nghĩa là trạng thái của bước chỉ được cập nhật sau khi bước tiếp theo được thực thi. Nói cách khác, bảng KHÔNG được cập nhật theo thời gian thực, cũng không phải mỗi giây.
Vì vậy, Brent đã tìm ra rằng có một thủ tục được lưu trữ không có giấy tờ sys.xp_sqlagent_enum_jobs, một phần của sp_help_job, có thể đưa ra trạng thái thực thi hiện tại của Tác vụ Tác nhân.
Mặc dù tôi đã tìm được cách để có được các công việc hiện đang chạy, tôi không hài lòng với tập lệnh này vì nó chỉ chạy trên SQL 2005/2008.
Tôi nên làm gì nếu tôi có phiên bản SQL 2000 và rất tò mò về các công việc hiện đang chạy?
Với một chút giúp đỡ của Tim Chapman (bậc thầy của www.QueryServerNation.com) tôi đã tìm ra cách để làm điều đó. CẢM ƠN, Tim!
Đây là kịch bản cuối cùng, sẽ chạy trên SQL 2000, 2005 và 2008 và sẽ cung cấp cho bạn các công việc đại lý SQL Server hiện đang chạy. . .rucky = 1).
Đơn giản như nó là. Thưởng thức.
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