Managing SQL Server Agent jobs is a critical part of maintaining automation, data movement, reporting, and maintenance operations in SQL Server environments. Whether you’re a DBA, DevOps engineer, or data analyst, having deep visibility into scheduled jobs can save time and help catch issues before they escalate.
In this post, we’ll explore a powerful T-SQL script that fetches a comprehensive overview of all SQL Server Agent jobs — including their configuration, schedules, steps, owners, and latest execution status. This script is extremely useful for audits, troubleshooting, or general job inventory.
🎯 Why This Matters
SQL Server Agent jobs often include:
- Data ETL processes (SSIS)
- Scheduled report generations
- Index rebuilds, backups, and DBCC checks
- Custom alerts or notifications
Yet SQL Server Management Studio (SSMS) GUI can be cumbersome when managing dozens or hundreds of jobs. That’s where this single query becomes a time-saving asset.
🧠 The SQL Server Metadata Behind the Magic
SQL Server stores job metadata in the msdb
database. This script queries the following system tables:
sysjobs
: Job definitionssysjobsteps
: T-SQL commands or actions taken in each stepsysjobschedules
,sysschedules
: Scheduling detailssyscategories
: Job categories (e.g., “Database Maintenance”)sysjobservers
: Last run stats (status, duration, etc.)
🛠️ The Script – One Query to Rule Them All
USE msdb;
GO
SELECT
jobs.job_id,
jobs.name AS job_name,
jobs.enabled AS job_enabled,
jobs.description,
jobs.date_created,
jobs.date_modified,
SUSER_SNAME(jobs.owner_sid) AS job_owner,
jobCategory.name AS job_category,
jobSteps.step_id,
jobSteps.step_name,
jobSteps.command,
jobSteps.database_name,
jobSteps.subsystem,
jobSteps.on_success_action,
jobSteps.on_fail_action,
schedules.schedule_id,
schedules.name AS schedule_name,
schedules.enabled AS schedule_enabled,
CASE freq_type
WHEN 1 THEN 'One Time'
WHEN 4 THEN 'Daily'
WHEN 8 THEN 'Weekly'
WHEN 16 THEN 'Monthly'
WHEN 32 THEN 'Monthly, relative'
WHEN 64 THEN 'When SQL Server Agent starts'
WHEN 128 THEN 'Start whenever CPU idle'
ELSE 'Other'
END AS schedule_type,
schedules.freq_interval,
schedules.freq_subday_type,
schedules.freq_subday_interval,
schedules.active_start_date,
schedules.active_end_date,
schedules.active_start_time,
schedules.active_end_time,
jobStats.last_run_date,
jobStats.last_run_time,
CASE jobStats.last_run_outcome
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Succeeded'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Canceled'
ELSE 'Unknown'
END AS last_run_status,
jobStats.last_run_duration
FROM
msdb.dbo.sysjobs jobs
LEFT JOIN
msdb.dbo.syscategories jobCategory
ON jobs.category_id = jobCategory.category_id
LEFT JOIN
msdb.dbo.sysjobsteps jobSteps
ON jobs.job_id = jobSteps.job_id
LEFT JOIN
msdb.dbo.sysjobschedules jobSchedules
ON jobs.job_id = jobSchedules.job_id
LEFT JOIN
msdb.dbo.sysschedules schedules
ON jobSchedules.schedule_id = schedules.schedule_id
LEFT JOIN
msdb.dbo.sysjobservers jobStats
ON jobs.job_id = jobStats.job_id
ORDER BY
jobs.name, jobSteps.step_id;
SQL🔍 What You’ll See in the Output
- ✅ Job name, creation/modification time
- 👤 Job owner (mapped to SQL login)
- 📜 All job steps with the actual command
- 🗓️ Full scheduling metadata (daily, weekly, monthly, etc.)
- ⏱️ Last run date, time, duration
- ❌ Last run status (Success/Fail/Retry/Cancel)
🛡️ Real-World Use Cases
- Job Auditing: Get a bird’s-eye view of all automation
- Failure Diagnosis: Filter for jobs where
last_run_outcome = 0
- Security Review: Identify jobs owned by SA or unauthorized users
- Performance Review: Find long-running or overlapping jobs
🧩 Bonus Tip
Need a list of just failed jobs from the last day? Add a WHERE clause:
WHERE jobStats.last_run_outcome = 0
AND jobStats.last_run_date = CONVERT(INT, CONVERT(VARCHAR, GETDATE(), 112))
SQL📘 Conclusion
This single T-SQL script empowers you with deep insight into SQL Server Agent job configuration and health — without relying on the SSMS GUI. Ideal for DBAs, sysadmins, and developers who need an operational overview at a glance.