diff --git a/SqlAgent/01_Devl/1_Database_Setup/CreateDB.sql b/SqlAgent/01_Devl/1_Database_Setup/CreateDB.sql new file mode 100644 index 0000000..4a9a22c --- /dev/null +++ b/SqlAgent/01_Devl/1_Database_Setup/CreateDB.sql @@ -0,0 +1,83 @@ +-- Create the database +CREATE DATABASE DevlDUTASJobSchedule; +GO + +USE DevlDUTASJobSchedule; +GO + +-- Create the main control table +CREATE TABLE dbo.JobControl +( + JobID INT IDENTITY(1,1) NOT NULL, + JobName VARCHAR(50) NOT NULL, + ScheduledStartTime TIME(7) NOT NULL, + SchedulerAction VARCHAR(10) NOT NULL, -- STOP or CONTINUE + IsActive BIT NOT NULL CONSTRAINT DF_JobControl_IsActive DEFAULT (1), + CreatedDate DATETIME NOT NULL CONSTRAINT DF_JobControl_CreatedDate DEFAULT (GETDATE()), + Frequency CHAR(20) NOT NULL CONSTRAINT DF_JobControl_Frequency DEFAULT ('DAILY'), + FrequencyPattern NVARCHAR(500) NULL, -- JSON scheduling rule + + CONSTRAINT PK_JobControl PRIMARY KEY CLUSTERED (JobID ASC), + CONSTRAINT UQ_JobControl_JobName UNIQUE NONCLUSTERED (JobName ASC), + CONSTRAINT CK_JobControl_SchedulerAction CHECK (SchedulerAction IN ('STOP', 'CONTINUE')) +); +GO + +-- Create job dependencies table +CREATE TABLE dbo.JobDependencies ( + DependencyID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + PredecessorJobName VARCHAR(50) NULL, + FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName) +); +GO + +-- Create execution history table +CREATE TABLE dbo.JobExecutionHistory ( + ExecutionID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(50) NOT NULL, + RunDate DATE NOT NULL, + ScheduledStartTime TIME NOT NULL, + ActualStartTime DATETIME NULL, + ActualEndTime DATETIME NULL, + Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')), + ErrorMessage VARCHAR(MAX) NULL, + OverrideFlag BIT DEFAULT 0, + OverrideBy VARCHAR(100) NULL, + OverrideDate DATETIME NULL +); +GO + +-- Create holidays table +CREATE TABLE dbo.FederalHolidays ( + HolidayID INT IDENTITY(1,1) PRIMARY KEY, + HolidayDate DATE NOT NULL UNIQUE, + HolidayName VARCHAR(100) NOT NULL, + Year INT NOT NULL +); +GO + +-- Create Exit Code table for PowerShell Script +CREATE TABLE dbo.JobExitCodes +( + JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution + JobName NVARCHAR(128) NOT NULL, -- job name + RunDate DATE NOT NULL, -- date of execution + ExitCode INT NOT NULL, -- exit code from job + RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution +); +GO +-- Create JobSchedule table +CREATE TABLE dbo.JobSchedule ( + JobScheduleID INT IDENTITY(1,1) PRIMARY KEY, + JobName VARCHAR(100) NOT NULL, + Frequency VARCHAR(20) CHECK (Frequency IN ('Monthly','Quarterly')), + ScheduledRule NVARCHAR(500) NULL, -- Copy of JSON or rule text from JobControl + ScheduledDate DATE NOT NULL, -- Planned date (before adjustment) + AdjustedRunDate DATE NOT NULL, -- Final working-day adjusted date + MonthOfSchedule CHAR(7) NOT NULL, -- 'YYYY-MM' + YearOfSchedule INT NOT NULL, + CreatedOn DATETIME DEFAULT GETDATE(), + CreatedBy VARCHAR(50) DEFAULT SUSER_SNAME() +); +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/1_Database_Setup/InsertHolidays.sql b/SqlAgent/01_Devl/1_Database_Setup/InsertHolidays.sql new file mode 100644 index 0000000..4122b78 --- /dev/null +++ b/SqlAgent/01_Devl/1_Database_Setup/InsertHolidays.sql @@ -0,0 +1,29 @@ +USE [DevlDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] ON +GO +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (1, CAST(N'2025-01-01' AS Date), N'New Years Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (2, CAST(N'2025-01-20' AS Date), N'Martin Luther King Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (3, CAST(N'2025-02-17' AS Date), N'Presidents Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (4, CAST(N'2025-05-26' AS Date), N'Memorial Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (5, CAST(N'2025-06-19' AS Date), N'Juneteenth Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (6, CAST(N'2025-07-04' AS Date), N'Independence Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (7, CAST(N'2025-09-01' AS Date), N'Labor Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (8, CAST(N'2025-10-13' AS Date), N'Columbus Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (9, CAST(N'2025-11-11' AS Date), N'Veterans Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (10, CAST(N'2025-11-27' AS Date), N'Thanksgiving Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (11, CAST(N'2025-12-25' AS Date), N'Christmas Day', 2025) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (12, CAST(N'2026-01-01' AS Date), N'New Years Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (13, CAST(N'2026-01-19' AS Date), N'Martin Luther King Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (14, CAST(N'2026-02-16' AS Date), N'Presidents Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (15, CAST(N'2026-05-25' AS Date), N'Memorial Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (16, CAST(N'2026-06-19' AS Date), N'Juneteenth Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (17, CAST(N'2026-07-03' AS Date), N'Independence Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (18, CAST(N'2026-09-07' AS Date), N'Labor Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (19, CAST(N'2026-10-12' AS Date), N'Columbus Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (20, CAST(N'2026-11-11' AS Date), N'Veterans Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (21, CAST(N'2026-11-26' AS Date), N'Thanksgiving Day', 2026) +INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (22, CAST(N'2026-12-25' AS Date), N'Christmas Day', 2026) +GO +SET IDENTITY_INSERT [dbo].[FederalHolidays] OFF +GO diff --git a/SqlAgent/01_Devl/1_Database_Setup/InsertJobControl.sql b/SqlAgent/01_Devl/1_Database_Setup/InsertJobControl.sql new file mode 100644 index 0000000..9f646af --- /dev/null +++ b/SqlAgent/01_Devl/1_Database_Setup/InsertJobControl.sql @@ -0,0 +1,143 @@ +USE [DevlDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobControl] ON +GO +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (1, N'DEVL_DAILY_DTSBX215', CAST(N'04:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (2, N'DEVL_DAILY_DTSBX305', CAST(N'04:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (3, N'DEVL_DAILY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (4, N'DEVL_DAILY_GSIRQ300', CAST(N'06:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (5, N'DEVL_DAILY_DTSRQ202', CAST(N'06:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (6, N'DEVL_DAILY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (7, N'DEVL_DAILY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (8, N'DEVL_DAILY_DTSFT202', CAST(N'08:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (9, N'DEVL_DAILY_DTSBX432', CAST(N'08:30:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (10, N'DEVL_DAILY_DTSGACHD', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (11, N'DEVL_DAILY_DTSBX303', CAST(N'10:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (12, N'DEVL_DAILY_DTSGWAGE', CAST(N'14:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (13, N'DEVL_DAILY_DTSGCHKS', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (14, N'DEVL_DAILY_DTSESDAY', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (15, N'DEVL_DAILY_DTSGPAYT', CAST(N'14:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (16, N'DEVL_DAILY_DTSDX145', CAST(N'16:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (17, N'DEVL_DAILY_DTSBX629', CAST(N'16:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (18, N'DEVL_DAILY_DTSBX630', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (19, N'DEVL_DAILY_DTSFRAUD', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (20, N'DEVL_DAILY_DTSRACHD', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (21, N'DEVL_DAILY_DTSBXACH', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (22, N'DEVL_DAILY_DTSBXREG', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (23, N'DEVL_DAILY_DTSBX430', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (24, N'DEVL_DAILY_DTSBX626', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (25, N'DEVL_DAILY_DTSBX530', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (26, N'DEVL_DAILY_DTSBXREL', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (27, N'DEVL_DAILY_DTSBX450', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (28, N'DEVL_DAILY_DTSBX451', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (29, N'DEVL_DAILY_DTSPACHD', CAST(N'18:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (30, N'DEVL_DAILY_DTSPX148', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (31, N'DEVL_DAILY_DTSRQ325', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (32, N'DEVL_DAILY_DTSBX427', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (33, N'DEVL_DAILY_DTSPDAY1', CAST(N'18:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (34, N'DEVL_DAILY_DTSW4WGE', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (35, N'DEVL_DAILY_DTSGSID2', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (36, N'DEVL_DAILY_DTSGSID9', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (37, N'DEVL_DAILY_DTSMIN01', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (38, N'DEVL_DAILY_DTSMIN02', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (39, N'DEVL_DAILY_DTSRQ459', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (40, N'DEVL_DAILY_DTSBXPFL', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (41, N'DEVL_DAILY_DESBD427', CAST(N'19:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (42, N'DEVL_DAILY_DTSBX403', CAST(N'20:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (43, N'DEVL_DAILY_DTSBE405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (44, N'DEVL_DAILY_DTSBX405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (45, N'DEVL_DAILY_DTSRQ335', CAST(N'21:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (46, N'DEVL_DAILY_DTSBX601', CAST(N'21:25:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (47, N'DEVL_WEEKLY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (48, N'DEVL_WEEKLY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (49, N'DEVL_WEEKLY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (50, N'DEVL_WEEKLY_DTSFT202', CAST(N'08:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (51, N'DEVL_WEEKLY_DTSBX470', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (52, N'DEVL_WEEKLY_DTSBXREJ', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Tue","Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (53, N'DEVL_WEEKLY_DTSPDAY7', CAST(N'19:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (54, N'DEVL_WEEKLY_DTSBX122', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (55, N'DEVL_WEEKLY_DTSRQ511', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (56, N'DEVL_WEEKLY_DTSRQ444', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (57, N'DEVL_WEEKLY_DTSRQ126', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (58, N'DEVL_MONTHLY_DTSRQ414', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (59, N'DEVL_MONTHLY_DTSPMON1', CAST(N'19:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (60, N'DEVL_MONTHLY_DTSCHGVB', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (61, N'DEVL_MONTHLY_DTSCHGVR', CAST(N'19:27:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (62, N'DEVL_MONTHLY_DTSVBKUP', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (63, N'DEVL_MONTHLY_DTSVRSTR', CAST(N'19:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (64, N'DEVL_MONTHLY_DTSRQ442', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (65, N'DEVL_MONTHLY_DTSBX460', CAST(N'19:35:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (66, N'DEVL_MONTHLY_DTSRQ513', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (67, N'DEVL_MONTHLY_DTSCHGDC', CAST(N'13:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (68, N'DEVL_QUARTERLY_DTSRQ119', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":3}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (69, N'DEVL_QUARTERLY_DTSRQ902', CAST(N'18:16:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (70, N'DEVL_QUARTERLY_DTSBX500', CAST(N'21:25:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (71, N'DEVL_QUARTERLY_DTSRQ417', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":31},{"Month":8,"Day":31},{"Month":11,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (72, N'DEVL_QUARTERLY_DTSRQ320', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":10},{"Month":5,"Day":10},{"Month":8,"Day":10},{"Month":11,"Day":10}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (73, N'DEVL_QUARTERLY_DTSRQ713', CAST(N'00:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":3,"Day":31},{"Month":6,"Day":30},{"Month":9,"Day":30},{"Month":12,"Day":31}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (74, N'DEVL_QUARTERLY_DTSBX468', CAST(N'15:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":30},{"Month":7,"Day":31},{"Month":10,"Day":30}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (75, N'DEVL_QUARTERLY_DTSCHGQ1', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (76, N'DEVL_QUARTERLY_DTSCHGQ2', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (77, N'DEVL_QUARTERLY_DTSRQ327', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (78, N'DEVL_QUARTERLY_DTSRQ328', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (79, N'DEVL_QUARTERLY_DTSRQ412', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":1,"Day":15},{"Month":4,"Day":15},{"Month":7,"Day":15},{"Month":10,"Day":15}]}') +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (80, N'DEVL_QUARTERLY_DTSRQ793', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (81, N'DEVL_QUARTERLY_DTSWGE06', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (82, N'DEVL_QUARTERLY_DTSCHGRT', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (83, N'DEVL_QUARTERLY_DTSCHRGS', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (84, N'DEVL_QUARTERLY_DTSRQ540', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (85, N'DEVL_QUARTERLY_DTSRQ591', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (86, N'DEVL_QUARTERLY_DTSRTCHG', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (87, N'DEVL_QUARTERLY_DTSWGE01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (88, N'DEVL_QUARTERLY_DESBD426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (89, N'DEVL_ONDEMAND_DTSACH01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (90, N'DEVL_ONDEMAND_DTSBX415', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (91, N'DEVL_ONDEMAND_DTSBX452', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (92, N'DEVL_ONDEMAND_DTSBX453', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (93, N'DEVL_ONDEMAND_DTSRQ120', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (94, N'DEVL_ONDEMAND_DTSRQ123', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (95, N'DEVL_ONDEMAND_DTSRQ125', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (96, N'DEVL_ONDEMAND_DTSRQ305', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (97, N'DEVL_ONDEMAND_DTSRQ306', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (98, N'DEVL_ONDEMAND_DTSRQ308', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (99, N'DEVL_ONDEMAND_DTSRQ311', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (100, N'DEVL_ONDEMAND_DTSRQ410', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (101, N'DEVL_ONDEMAND_DTSRQ411', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (102, N'DEVL_ONDEMAND_DTSRQ423', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (103, N'DEVL_ONDEMAND_DTSRQ426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (104, N'DEVL_ONDEMAND_DTSRQ429', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (105, N'DEVL_ONDEMAND_DTSRQ439', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (106, N'DEVL_ONDEMAND_DTSRQ602', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (107, N'DEVL_ONDEMAND_DTSRQ606', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (108, N'DEVL_ONDEMAND_DTSRQ607', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (109, N'DEVL_ONDEMAND_DTSRQ609', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (110, N'DEVL_ONDEMAND_DTSRQ611', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (111, N'DEVL_ONDEMAND_DTSRQ612', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (112, N'DEVL_ONDEMAND_DTSRQ717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (113, N'DEVL_ONDEMAND_DTSRQ718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (114, N'DEVL_ONDEMAND_DTSRQ720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (115, N'DEVL_ONDEMAND_DTSRQ721', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (116, N'DEVL_ONDEMAND_DTSRT715', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (117, N'DEVL_ONDEMAND_DTSRT716', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (118, N'DEVL_ONDEMAND_DTSRT717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (119, N'DEVL_ONDEMAND_DTSRT718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (120, N'DEVL_ONDEMAND_DTSRT719', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (121, N'DEVL_ONDEMAND_DTSRT720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (122, N'DEVL_ONDEMAND_DTSRT722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (123, N'DEVL_ONDEMAND_DTSRT723', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (124, N'DEVL_YEARLY_DTSRQ722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (125, N'DEVL_YEARLY_DTSRQ451', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (126, N'DEVL_YEARLY_DTSRQ127', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (127, N'DEVL_YEARLY_DTSRQ321', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (128, N'DEVL_YEARLY_DTSRQ455', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (129, N'DEVL_YEARLY_DTSRQ500', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (130, N'DEVL_YEARLY_DTSRQ517', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (131, N'DEVL_YEARLY_DTSRQ518', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (132, N'DEVL_YEARLY_DTSRQ616', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (133, N'DEVL_YEARLY_DTSRQ701', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (134, N'DEVL_YEARLY_DTSRQ702', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (135, N'DEVL_YEARLY_DTSRQ704', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (136, N'DEVL_YEARLY_DTSRQ910', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL) +GO +SET IDENTITY_INSERT [dbo].[JobControl] OFF +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/01_Devl/1_Database_Setup/InsertJobDependencies.sql new file mode 100644 index 0000000..60d5179 --- /dev/null +++ b/SqlAgent/01_Devl/1_Database_Setup/InsertJobDependencies.sql @@ -0,0 +1,92 @@ +USE [DevlDUTASJobSchedule] +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] ON +GO +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (1, N'DEVL_DAILY_DTSGSID0', N'DEVL_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (2, N'DEVL_DAILY_GSIRQ300', N'DEVL_DAILY_DTSBX305') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (3, N'DEVL_DAILY_DTSRQ202', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (4, N'DEVL_DAILY_DTSGSID1', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (5, N'DEVL_DAILY_DTSBX202', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (6, N'DEVL_DAILY_DTSFT202', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (7, N'DEVL_DAILY_DTSBX432', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (8, N'DEVL_DAILY_DTSGACHD', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (9, N'DEVL_DAILY_DTSBX303', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (10, N'DEVL_DAILY_DTSGWAGE', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (11, N'DEVL_DAILY_DTSGCHKS', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (12, N'DEVL_DAILY_DTSESDAY', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (13, N'DEVL_DAILY_DTSGPAYT', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (14, N'DEVL_DAILY_DTSDX145', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (15, N'DEVL_DAILY_DTSBX629', N'DEVL_DAILY_GSIRQ300') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (16, N'DEVL_DAILY_DTSBX630', N'DEVL_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (17, N'DEVL_DAILY_DTSFRAUD', N'DEVL_DAILY_DTSBX629') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (18, N'DEVL_DAILY_DTSRACHD', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (19, N'DEVL_DAILY_DTSBXACH', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (20, N'DEVL_DAILY_DTSBXREG', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (21, N'DEVL_DAILY_DTSBX430', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (22, N'DEVL_DAILY_DTSBX626', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (23, N'DEVL_DAILY_DTSBX530', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (24, N'DEVL_DAILY_DTSBXREL', N'DEVL_DAILY_DTSFRAUD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (25, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (26, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (27, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (28, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (29, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (30, N'DEVL_DAILY_DTSBX450', N'DEVL_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (31, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBXACH') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (32, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBXREG') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (33, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBX430') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (34, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBX626') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (35, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBX530') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (36, N'DEVL_DAILY_DTSBX451', N'DEVL_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (37, N'DEVL_DAILY_DTSPACHD', N'DEVL_DAILY_DTSBX450') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (38, N'DEVL_DAILY_DTSPACHD', N'DEVL_DAILY_DTSBX451') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (39, N'DEVL_DAILY_DTSPX148', N'DEVL_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (40, N'DEVL_DAILY_DTSRQ325', N'DEVL_DAILY_DTSPACHD') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (41, N'DEVL_DAILY_DTSBX427', N'DEVL_DAILY_DTSPX148') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (42, N'DEVL_DAILY_DTSBX427', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (43, N'DEVL_DAILY_DTSPDAY1', N'DEVL_DAILY_DTSBX427') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (44, N'DEVL_DAILY_DTSW4WGE', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (45, N'DEVL_DAILY_DTSGSID2', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (46, N'DEVL_DAILY_DTSGSID9', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (47, N'DEVL_DAILY_DTSMIN01', N'DEVL_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (48, N'DEVL_DAILY_DTSMIN01', N'DEVL_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (49, N'DEVL_DAILY_DTSMIN01', N'DEVL_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (50, N'DEVL_DAILY_DTSMIN02', N'DEVL_DAILY_DTSW4WGE') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (51, N'DEVL_DAILY_DTSMIN02', N'DEVL_DAILY_DTSGSID2') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (52, N'DEVL_DAILY_DTSMIN02', N'DEVL_DAILY_DTSGSID9') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (53, N'DEVL_DAILY_DTSRQ459', N'DEVL_DAILY_DTSMIN01') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (54, N'DEVL_DAILY_DTSRQ459', N'DEVL_DAILY_DTSMIN02') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (55, N'DEVL_DAILY_DTSBXPFL', N'DEVL_DAILY_DTSRQ459') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (56, N'DEVL_DAILY_DESBD427', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (57, N'DEVL_DAILY_DTSBX403', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (58, N'DEVL_DAILY_DTSBE405', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (59, N'DEVL_DAILY_DTSBX405', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (60, N'DEVL_DAILY_DTSRQ335', N'DEVL_DAILY_DTSBXPFL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (61, N'DEVL_DAILY_DTSBX601', N'DEVL_DAILY_DTSRQ335') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (62, N'DEVL_WEEKLY_DTSBXREJ', N'DEVL_DAILY_DTSBXREL') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (63, N'DEVL_WEEKLY_DTSBX122', N'DEVL_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (64, N'DEVL_WEEKLY_DTSRQ511', N'DEVL_WEEKLY_DTSPDAY7') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (65, N'DEVL_MONTHLY_DTSRQ414', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (66, N'DEVL_MONTHLY_DTSCHGVB', N'DEVL_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (67, N'DEVL_MONTHLY_DTSCHGVR', N'DEVL_MONTHLY_DTSCHGVB') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (68, N'DEVL_MONTHLY_DTSVBKUP', N'DEVL_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (69, N'DEVL_MONTHLY_DTSVRSTR', N'DEVL_MONTHLY_DTSVBKUP') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (70, N'DEVL_MONTHLY_DTSRQ442', N'DEVL_MONTHLY_DTSRQ513') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (71, N'DEVL_QUARTERLY_DTSRQ119', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (72, N'DEVL_QUARTERLY_DTSRQ417', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (73, N'DEVL_QUARTERLY_DTSRQ320', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (74, N'DEVL_QUARTERLY_DTSRQ793', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (75, N'DEVL_QUARTERLY_DTSCHGQ1', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (76, N'DEVL_QUARTERLY_DTSRQ327', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (77, N'DEVL_QUARTERLY_DTSRQ412', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (78, N'DEVL_QUARTERLY_DTSRQ591', N'DEVL_DAILY_DTSRQ325') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (79, N'DEVL_QUARTERLY_DTSRQ902', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (80, N'DEVL_QUARTERLY_DTSCHGQ2', N'DEVL_DAILY_DTSPDAY1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (81, N'DEVL_QUARTERLY_DTSCHGRT', N'DEVL_QUARTERLY_DTSRQ591') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (82, N'DEVL_QUARTERLY_DTSRQ328', N'DEVL_QUARTERLY_DTSRQ327') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (83, N'DEVL_QUARTERLY_DTSBX500', N'DEVL_QUARTERLY_DTSRQ417') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (84, N'DEVL_QUARTERLY_DTSRQ713', N'DEVL_MONTHLY_DTSPMON1') +INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (85, N'DEVL_QUARTERLY_DTSCHRGS', N'DEVL_QUARTERLY_DTSCHGRT') +GO +SET IDENTITY_INSERT [dbo].[JobDependencies] OFF +GO diff --git a/SqlAgent/01_Devl/2_Functions/fn_GetNextWorkday.sql b/SqlAgent/01_Devl/2_Functions/fn_GetNextWorkday.sql new file mode 100644 index 0000000..6a8740a --- /dev/null +++ b/SqlAgent/01_Devl/2_Functions/fn_GetNextWorkday.sql @@ -0,0 +1,17 @@ +USE DevlDUTASJobSchedule; +GO +-- Returns the next valid workday on or after the given date +CREATE OR ALTER FUNCTION dbo.fn_GetNextWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, 1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/01_Devl/2_Functions/fn_GetPreviousWorkday.sql b/SqlAgent/01_Devl/2_Functions/fn_GetPreviousWorkday.sql new file mode 100644 index 0000000..dc06a91 --- /dev/null +++ b/SqlAgent/01_Devl/2_Functions/fn_GetPreviousWorkday.sql @@ -0,0 +1,17 @@ +USE DevlDUTASJobSchedule; +GO +-- Returns the most recent valid workday before or equal to the given date +CREATE OR ALTER FUNCTION dbo.fn_GetPreviousWorkday (@InputDate DATE) +RETURNS DATE +AS +BEGIN + DECLARE @Workday DATE = @InputDate; + + WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday) + BEGIN + SET @Workday = DATEADD(DAY, -1, @Workday); + END + + RETURN @Workday; +END; diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CheckJobConditions.sql new file mode 100644 index 0000000..6711343 Binary files /dev/null and b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CheckJobConditions.sql differ diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql new file mode 100644 index 0000000..453879f Binary files /dev/null and b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql new file mode 100644 index 0000000..c2cd1ea --- /dev/null +++ b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql @@ -0,0 +1,98 @@ +USE msdb; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateDailyJobSchedule + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobID INT, + @JobName SYSNAME, + @ScheduledStartTime TIME(0), + @Frequency NVARCHAR(20), + @FrequencyPattern NVARCHAR(MAX), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @TimeString VARCHAR(8), + @ActiveStartDate INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + -- Prepare active start date as INT (YYYYMMDD) + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -- Dynamic SQL to fetch jobs from the appropriate database + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FOR + SELECT JobID, JobName, ScheduledStartTime, Frequency, FrequencyPattern + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''DAILY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + + WHILE @@FETCH_STATUS = 0 + BEGIN + -- Step 1: Convert ScheduledStartTime (TIME) to HH:MM:SS string + SET @TimeString = CONVERT(VARCHAR(8), @ScheduledStartTime, 108); + + -- Step 2: Remove colons and convert to INT (HHMMSS) + SET @StartTimeInt = CONVERT(INT, REPLACE(@TimeString, ':', '')); + + -- Step 3: Prepare schedule name + SET @ScheduleName = CONCAT(@JobName, '_DailySchedule'); + + -- Step 4: Fixed freq_interval for Monday to Friday + SET @FreqInterval = 62; -- Mon(2)+Tue(4)+Wed(8)+Thu(16)+Fri(32) = 62 + + -- Step 5: Delete existing schedule if it exists (idempotency) + IF EXISTS ( + SELECT 1 + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName + ) + BEGIN + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; + END + + -- Step 6: Create weekly schedule (Monday to Friday) running once per day + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- weekly + @freq_interval = @FreqInterval, + @freq_recurrence_factor = 1, -- every week + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveStartDate; + + -- Step 7: Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Fetch next job + FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'Daily job schedules (Monday to Friday) created successfully for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateSQLAgentJob.sql new file mode 100644 index 0000000..cfba9e9 Binary files /dev/null and b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateSQLAgentJob.sql differ diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateWeeklySchedules.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateWeeklySchedules.sql new file mode 100644 index 0000000..2021821 --- /dev/null +++ b/SqlAgent/01_Devl/3_Stored_Procedures/usp_CreateWeeklySchedules.sql @@ -0,0 +1,223 @@ +USE [msdb]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_CreateWeeklySchedules + @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobName SYSNAME, + @FrequencyPattern NVARCHAR(MAX), + @StartTime VARCHAR(50), + @ScheduleName SYSNAME, + @StartTimeInt INT, + @FreqInterval INT, + @ActiveDate INT, + @computedFreq INT, + @dbName SYSNAME; -- Added variable for database name + + -- Determine database name based on environment + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + + SET @ActiveDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112)); + + -------------------------------------------------------------------------- + -- Dynamic SQL for cursor to fetch active weekly jobs from appropriate database + -------------------------------------------------------------------------- + DECLARE @Sql NVARCHAR(MAX); + SET @Sql = N' + DECLARE job_cursor CURSOR FAST_FORWARD FOR + SELECT + JobName, + FrequencyPattern, + ScheduledStartTime + FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl + WHERE UPPER(Frequency) = ''WEEKLY'' + AND IsActive = 1;'; + + -- Execute dynamic SQL to declare cursor + EXEC sp_executesql @Sql; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + BEGIN TRY + ------------------------------------------------------------------ + -- Reset per-job variables + ------------------------------------------------------------------ + SET @FreqInterval = 0; + SET @computedFreq = 0; + SET @StartTimeInt = NULL; + SET @ScheduleName = NULL; + + ------------------------------------------------------------------ + -- Correctly format the start time (HHMMSS without extra zeros) + ------------------------------------------------------------------ + SET @StartTime = LTRIM(RTRIM(ISNULL(@StartTime, '00:00:00'))); + + -- Parse time and convert to HHMMSS integer + DECLARE @TimeParts TABLE (part NVARCHAR(10), idx INT); + INSERT INTO @TimeParts (part, idx) + SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 + FROM STRING_SPLIT(LEFT(@StartTime, 8), ':'); + + DECLARE @Hours INT, @Minutes INT, @Seconds INT; + + SELECT @Hours = CAST(part AS INT) FROM @TimeParts WHERE idx = 0; + SELECT @Minutes = CAST(part AS INT) FROM @TimeParts WHERE idx = 1; + SELECT @Seconds = CAST(part AS INT) FROM @TimeParts WHERE idx = 2; + + -- Ensure valid time ranges + SET @Hours = ISNULL(@Hours, 0); + SET @Minutes = ISNULL(@Minutes, 0); + SET @Seconds = ISNULL(@Seconds, 0); + + IF @Hours < 0 OR @Hours > 23 SET @Hours = 0; + IF @Minutes < 0 OR @Minutes > 59 SET @Minutes = 0; + IF @Seconds < 0 OR @Seconds > 59 SET @Seconds = 0; + + SET @StartTimeInt = (@Hours * 10000) + (@Minutes * 100) + @Seconds; + + SET @ScheduleName = CONCAT(@JobName, '_WeeklySchedule'); + + ------------------------------------------------------------------ + -- Parse JSON days using a local temporary table + ------------------------------------------------------------------ + CREATE TABLE #Days (DayName NVARCHAR(10)); + + INSERT INTO #Days (DayName) + SELECT TRIM(value) + FROM OPENJSON(ISNULL(@FrequencyPattern, '{}'), '$.Days'); + + ------------------------------------------------------------------ + -- Compute bitmask correctly (values should be 1-127) + ------------------------------------------------------------------ + SELECT @computedFreq = ISNULL(SUM( + CASE UPPER(DayName) + WHEN 'SUN' THEN 1 + WHEN 'MON' THEN 2 + WHEN 'TUE' THEN 4 + WHEN 'WED' THEN 8 + WHEN 'THU' THEN 16 + WHEN 'FRI' THEN 32 + WHEN 'SAT' THEN 64 + ELSE 0 + END + ), 0) + FROM #Days; + + DROP TABLE #Days; -- Explicitly drop the temp table + + SET @FreqInterval = ISNULL(@computedFreq, 0); + + ------------------------------------------------------------------ + -- Validate freq_interval (must be 1..127) + ------------------------------------------------------------------ + IF @FreqInterval < 1 OR @FreqInterval > 127 + BEGIN + PRINT 'Warning: Weekly job ' + @JobName + + ' has invalid freq_interval (' + ISNULL(CAST(@FreqInterval AS VARCHAR(10)), 'NULL') + + '). Days found: ' + ISNULL(@FrequencyPattern, 'None') + '. Skipping.'; + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + CONTINUE; + END + + ------------------------------------------------------------------ + -- Debug output to verify calculations + ------------------------------------------------------------------ + PRINT 'Job: ' + @JobName + + ', Days: ' + @FrequencyPattern + + ', FreqInterval: ' + CAST(@FreqInterval AS VARCHAR(3)) + + ', StartTime: ' + CAST(@StartTimeInt AS VARCHAR(6)); + + ------------------------------------------------------------------ + -- Safely detach and delete any existing schedule with this name + -- Use TRY/CATCH for schedule operations since non-existence is expected + ------------------------------------------------------------------ + BEGIN TRY + DECLARE @schedule_id INT; + DECLARE @attach_count INT; + + -- Check if schedule exists and get its ID + SELECT @schedule_id = s.schedule_id + FROM msdb.dbo.sysschedules s + JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id + JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id + WHERE j.name = @JobName AND s.name = @ScheduleName; + + IF @schedule_id IS NOT NULL + BEGIN + -- Detach from this job (if attached) + EXEC msdb.dbo.sp_detach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + -- Check if schedule still attached to other jobs + SELECT @attach_count = COUNT(*) + FROM msdb.dbo.sysjobschedules js + WHERE js.schedule_id = @schedule_id; + + IF @attach_count = 0 + BEGIN + EXEC msdb.dbo.sp_delete_schedule + @schedule_name = @ScheduleName; + PRINT 'Existing schedule deleted: ' + @ScheduleName; + END + ELSE + BEGIN + PRINT 'Notice: schedule ' + @ScheduleName + ' could not be deleted because it is still attached to other jobs.'; + END + END + END TRY + BEGIN CATCH + -- Schedule operations might fail if schedule doesn't exist, which is fine + PRINT 'Notice: ' + ERROR_MESSAGE() + ' - proceeding with new schedule creation.'; + END CATCH + + ------------------------------------------------------------------ + -- Create the unified weekly schedule with subday config + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 8, -- Weekly + @freq_interval = @FreqInterval, -- Bitmask of weekdays + @freq_recurrence_factor = 1, -- Every week + @freq_subday_type = 1, -- Once per day + @freq_subday_interval = 1, + @active_start_time = @StartTimeInt, + @active_start_date = @ActiveDate; + + ------------------------------------------------------------------ + -- Attach the schedule to the job + ------------------------------------------------------------------ + EXEC msdb.dbo.sp_attach_schedule + @job_name = @JobName, + @schedule_name = @ScheduleName; + + PRINT 'Weekly schedule created for job: ' + @JobName + + ' (Days=' + CAST(@FreqInterval AS VARCHAR(10)) + + ', Time=' + RIGHT('000000' + CAST(@StartTimeInt AS VARCHAR(6)), 6) + ')'; + + END TRY + BEGIN CATCH + PRINT 'Error scheduling job ' + ISNULL(@JobName, 'Unknown') + ': ' + ERROR_MESSAGE(); + END CATCH; + + FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; + + PRINT 'All weekly job schedules processed for ' + @dbName; +END; +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_ForceComplete.sql new file mode 100644 index 0000000..66a3d0d Binary files /dev/null and b/SqlAgent/01_Devl/3_Stored_Procedures/usp_ForceComplete.sql differ diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_GenerateJobSchedule.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_GenerateJobSchedule.sql new file mode 100644 index 0000000..afd72d9 --- /dev/null +++ b/SqlAgent/01_Devl/3_Stored_Procedures/usp_GenerateJobSchedule.sql @@ -0,0 +1,261 @@ +USE [DevlDUTASJobSchedule]; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_GenerateJobSchedule + @Year INT +AS +BEGIN + SET NOCOUNT ON; + + ------------------------------------------------------------------------- + -- 1. Cleanup existing schedule data for this year + ------------------------------------------------------------------------- + DELETE FROM dbo.JobSchedule WHERE YearOfSchedule = @Year; + + ------------------------------------------------------------------------- + -- 2. Variable declarations + ------------------------------------------------------------------------- + DECLARE + @JobName VARCHAR(100), + @Frequency VARCHAR(20), + @Pattern NVARCHAR(2000), + @ScheduledTime TIME, + @RuleName NVARCHAR(100), + @Month INT, + @BaseDate DATE, + @ScheduledDate DATE, + @AdjustedDate DATE, + @FailSafeDate DATE = '9999-12-31'; + + ------------------------------------------------------------------------- + -- 3. Temporary table to process jobs more efficiently + ------------------------------------------------------------------------- + CREATE TABLE #JobProcessing ( + JobName VARCHAR(100), + Frequency VARCHAR(20), + Pattern NVARCHAR(2000), + ScheduledTime TIME, + RuleName NVARCHAR(100), + MonthsJSON NVARCHAR(MAX), + DayNum INT, + HasExplicitSchedule BIT + ); + + -- Populate temporary table with parsed JSON data + INSERT INTO #JobProcessing (JobName, Frequency, Pattern, ScheduledTime, RuleName, MonthsJSON, DayNum, HasExplicitSchedule) + SELECT + jc.JobName, + jc.Frequency, + jc.FrequencyPattern, + jc.ScheduledStartTime, + JSON_VALUE(jc.FrequencyPattern, '$.Rule'), + JSON_QUERY(jc.FrequencyPattern, '$.Months'), + JSON_VALUE(jc.FrequencyPattern, '$.Day'), + CASE WHEN JSON_QUERY(jc.FrequencyPattern, '$.Schedule') IS NOT NULL THEN 1 ELSE 0 END + FROM dbo.JobControl jc + WHERE UPPER(jc.Frequency) IN ('MONTHLY','QUARTERLY') + AND jc.IsActive = 1; + + ------------------------------------------------------------------------- + -- 4. Process MONTHLY jobs + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS ScheduledDate, + CASE + WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1)) + WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1))) + ELSE @FailSafeDate + END AS AdjustedRunDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName IN ('FirstWorkday', 'LastWorkday'); + + -- Handle monthly jobs with unknown rules + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum) + WHERE jp.Frequency = 'MONTHLY' + AND jp.RuleName NOT IN ('FirstWorkday', 'LastWorkday'); + + ------------------------------------------------------------------------- + -- 5. Process QUARTERLY jobs - FirstWorkdayOfQuarter + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)), + FORMAT(DATEFROMPARTS(@Year, q.StartMonth, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + CROSS JOIN (VALUES (1),(4),(7),(10)) q(StartMonth) + WHERE jp.Frequency = 'QUARTERLY' + AND jp.RuleName = 'FirstWorkdayOfQuarter'; + + ------------------------------------------------------------------------- + -- 6. Process QUARTERLY jobs - Months array with Day number + ------------------------------------------------------------------------- + ;WITH QuarterlyMonths AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + CAST(m.[value] AS INT) AS MonthNum, + jp.DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.MonthsJSON) m + WHERE jp.Frequency = 'QUARTERLY' + AND jp.MonthsJSON IS NOT NULL + AND jp.DayNum IS NOT NULL + AND jp.RuleName IS NULL + AND jp.HasExplicitSchedule = 0 + ), + QuarterlyDates AS ( + SELECT + qm.JobName, + qm.Frequency, + qm.Pattern, + qm.MonthNum, + qm.DayNum, + CASE + WHEN qm.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, qm.MonthNum, qm.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1)) + END AS BaseDate + FROM QuarterlyMonths qm + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + qd.JobName, + qd.Frequency, + qd.Pattern, + qd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, qd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = qd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(qd.BaseDate) + ELSE qd.BaseDate + END AS AdjustedRunDate, + FORMAT(qd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM QuarterlyDates qd; + + ------------------------------------------------------------------------- + -- 7. Process QUARTERLY jobs - Explicit Schedule array + ------------------------------------------------------------------------- + ;WITH ExplicitSchedules AS ( + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + s.[Month] AS MonthNum, + s.[Day] AS DayNum + FROM #JobProcessing jp + CROSS APPLY OPENJSON(jp.Pattern, '$.Schedule') + WITH ( + [Month] INT '$.Month', + [Day] INT '$.Day' + ) s + WHERE jp.Frequency = 'QUARTERLY' + AND jp.HasExplicitSchedule = 1 + ), + ExplicitScheduleDates AS ( + SELECT + es.JobName, + es.Frequency, + es.Pattern, + es.MonthNum, + es.DayNum, + CASE + WHEN es.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1))) + THEN DATEFROMPARTS(@Year, es.MonthNum, es.DayNum) + ELSE EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1)) + END AS BaseDate + FROM ExplicitSchedules es + ) + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + esd.JobName, + esd.Frequency, + esd.Pattern, + esd.BaseDate, + CASE + WHEN DATENAME(WEEKDAY, esd.BaseDate) IN ('Saturday','Sunday') + OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = esd.BaseDate) + THEN dbo.fn_GetPreviousWorkday(esd.BaseDate) + ELSE esd.BaseDate + END AS AdjustedRunDate, + FORMAT(esd.BaseDate, 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM ExplicitScheduleDates esd; + + ------------------------------------------------------------------------- + -- 8. Handle any quarterly jobs that didn't match the patterns above + ------------------------------------------------------------------------- + INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy) + SELECT + jp.JobName, + jp.Frequency, + jp.Pattern, + @FailSafeDate, + @FailSafeDate, + FORMAT(DATEFROMPARTS(@Year, 1, 1), 'yyyy-MM'), + @Year, + GETDATE(), + SYSTEM_USER + FROM #JobProcessing jp + WHERE jp.Frequency = 'QUARTERLY' + AND NOT EXISTS ( + SELECT 1 FROM dbo.JobSchedule js + WHERE js.JobName = jp.JobName AND js.YearOfSchedule = @Year + ); + + ------------------------------------------------------------------------- + -- 9. Cleanup and output + ------------------------------------------------------------------------- + DROP TABLE #JobProcessing; + + -- Update any NULL dates to fail-safe date + UPDATE dbo.JobSchedule + SET ScheduledDate = @FailSafeDate, + AdjustedRunDate = @FailSafeDate + WHERE YearOfSchedule = @Year + AND (ScheduledDate IS NULL OR AdjustedRunDate IS NULL); + + DECLARE @RecordCount INT = (SELECT COUNT(*) FROM dbo.JobSchedule WHERE YearOfSchedule = @Year); + + PRINT 'Job schedule generation completed for year ' + CAST(@Year AS VARCHAR(4)) + + '. Total records created: ' + CAST(@RecordCount AS VARCHAR(10)); +END; +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_ScheduleJob.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_ScheduleJob.sql new file mode 100644 index 0000000..f6c2ffa --- /dev/null +++ b/SqlAgent/01_Devl/3_Stored_Procedures/usp_ScheduleJob.sql @@ -0,0 +1,160 @@ +USE [msdb] +GO + +/****** Object: StoredProcedure [dbo].[usp_ScheduleJob] Script Date: 10/18/2025 9:52:04 AM ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + + +CREATE OR ALTER PROCEDURE [dbo].[usp_ScheduleJob] + @JobName NVARCHAR(100), + @Env CHAR(4), -- 'DEVL' | 'TEST' | 'PROD' + @RunDate DATE, + @RunTime TIME +AS +BEGIN + SET NOCOUNT ON; + + DECLARE + @JobId UNIQUEIDENTIFIER, + @ScheduleName NVARCHAR(200), + @dbName NVARCHAR(128), + @ActiveStartDate INT, + @ActiveStartTime INT, + @Sql NVARCHAR(MAX), + @JobExists BIT = 0, + @ScheduleId INT; + + -- Table variable must be declared separately and at the top level + DECLARE @ExistingSchedules TABLE ( + schedule_id INT, + schedule_name NVARCHAR(200) + ); + + -- Map environment to actual DB name + SET @dbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + ELSE 'DevlDUTASJobSchedule' + END; + + -- Validate parameters + IF @Env NOT IN ('DEVL','TEST','PROD') + BEGIN + RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1); + RETURN; + END + + IF @RunDate < CAST(GETDATE() AS DATE) + BEGIN + RAISERROR('RunDate cannot be in the past.', 16, 1); + RETURN; + END; + + -- Check if job exists in JobControl table + SET @Sql = N'SELECT @JobExists = 1 FROM ' + QUOTENAME(@dbName) + '.dbo.JobControl WHERE JobName = @JobNameParam'; + + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100), @JobExists BIT OUTPUT', + @JobNameParam = @JobName, + @JobExists = @JobExists OUTPUT; + + IF @JobExists = 0 + BEGIN + RAISERROR('Job %s not found in JobControl table.', 16, 1, @JobName); + RETURN; + END; + + -- Activate job in control table + SET @Sql = N'UPDATE ' + QUOTENAME(@dbName) + '.dbo.JobControl SET IsActive = 1 WHERE JobName = @JobNameParam'; + EXEC sp_executesql @Sql, + N'@JobNameParam NVARCHAR(100)', + @JobNameParam = @JobName; + + PRINT 'Job activated in JobControl.'; + + -- Convert date/time to SQL Agent format + SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), @RunDate, 112)); + SET @ActiveStartTime = DATEPART(HOUR, @RunTime) * 10000 + + DATEPART(MINUTE, @RunTime) * 100 + + DATEPART(SECOND, @RunTime); + + SET @ScheduleName = @JobName + '_MonthlySchedule'; + + -- Get job id + SELECT @JobId = job_id + FROM msdb.dbo.sysjobs + WHERE name = @JobName; + + IF @JobId IS NULL + BEGIN + RAISERROR('SQL Agent job "%s" not found.', 16, 1, @JobName); + RETURN; + END; + + BEGIN TRY + BEGIN TRANSACTION; + + -- Detach and delete all existing schedules for this job + INSERT INTO @ExistingSchedules (schedule_id, schedule_name) + SELECT s.schedule_id, s.name + FROM msdb.dbo.sysschedules AS s + INNER JOIN msdb.dbo.sysjobschedules AS js ON s.schedule_id = js.schedule_id + WHERE js.job_id = @JobId; + + DECLARE @OldScheduleId INT, @OldScheduleName NVARCHAR(200); + + DECLARE cur CURSOR LOCAL FAST_FORWARD FOR + SELECT schedule_id, schedule_name FROM @ExistingSchedules; + + OPEN cur; + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + + WHILE @@FETCH_STATUS = 0 + BEGIN + PRINT 'Detaching old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @OldScheduleName; + + PRINT 'Deleting old schedule: ' + @OldScheduleName; + EXEC msdb.dbo.sp_delete_schedule @schedule_name = @OldScheduleName; + + FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName; + END + + CLOSE cur; + DEALLOCATE cur; + + -- Create new one-time schedule + EXEC msdb.dbo.sp_add_schedule + @schedule_name = @ScheduleName, + @enabled = 1, + @freq_type = 1, -- One-time + @active_start_date = @ActiveStartDate, + @active_start_time = @ActiveStartTime; + + -- Attach schedule to job + EXEC msdb.dbo.sp_attach_schedule + @job_id = @JobId, + @schedule_name = @ScheduleName; + + COMMIT TRANSACTION; + + PRINT 'New schedule created for job "' + @JobName + + '" on ' + CONVERT(VARCHAR(10), @RunDate, 120) + + ' at ' + CONVERT(VARCHAR(8), @RunTime, 108); + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 + ROLLBACK TRANSACTION; + + DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE(); + RAISERROR('Error creating schedule: %s', 16, 1, @ErrorMessage); + END CATCH; +END; +GO + + diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql new file mode 100644 index 0000000..0be312a --- /dev/null +++ b/SqlAgent/01_Devl/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql @@ -0,0 +1,39 @@ +USE DevlDUTASJobSchedule; +GO + +CREATE OR ALTER PROCEDURE dbo.usp_ScheduleJobsForMonth +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @MonthKey CHAR(7) = FORMAT(GETDATE(), 'yyyy-MM'); + DECLARE @Year INT = YEAR(GETDATE()); + DECLARE @JobName VARCHAR(100); + DECLARE @RunDate DATE; + DECLARE @RunTime TIME; + DECLARE @Env VARCHAR(10) = 'DEVL'; -- configurable per environment + + DECLARE job_cursor CURSOR FOR + SELECT js.JobName, js.AdjustedRunDate, jc.ScheduledStartTime + FROM dbo.JobSchedule js + INNER JOIN dbo.JobControl jc ON js.JobName = jc.JobName + WHERE js.MonthOfSchedule = @MonthKey + AND jc.IsActive = 1; + + OPEN job_cursor; + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + + WHILE @@FETCH_STATUS = 0 + BEGIN + EXEC msdb.dbo.usp_ScheduleJob + @JobName = @JobName, + @Env = @Env, + @RunDate = @RunDate, + @RunTime = @RunTime; + + FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime; + END + + CLOSE job_cursor; + DEALLOCATE job_cursor; +END diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_TriggerMissedJobs.sql new file mode 100644 index 0000000..0176424 Binary files /dev/null and b/SqlAgent/01_Devl/3_Stored_Procedures/usp_TriggerMissedJobs.sql differ diff --git a/SqlAgent/01_Devl/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/01_Devl/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql new file mode 100644 index 0000000..959016b Binary files /dev/null and b/SqlAgent/01_Devl/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/ActivateOnDemandJob.sql b/SqlAgent/01_Devl/4_Job_Maintenance/ActivateOnDemandJob.sql new file mode 100644 index 0000000..e6a4f58 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/ActivateOnDemandJob.sql @@ -0,0 +1,10 @@ +USE msdb; +GO + +-- Schedule DEVL OnDemand Job on 03 Nov at 18:15 PM +------------------------------------------------ +EXEC dbo.usp_ScheduleJob + @JobName='DEVL_MONTHLY_DTSRQ414', + @Env='DEVL', + @RunDate='2025-11-03', + @RunTime='18:15:00'; diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/AddAllJobsToSQLAgent.sql b/SqlAgent/01_Devl/4_Job_Maintenance/AddAllJobsToSQLAgent.sql new file mode 100644 index 0000000..1fe50e2 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/AddAllJobsToSQLAgent.sql @@ -0,0 +1,141 @@ +USE [msdb] +GO + +-- Execute the stored procedure for each job +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX215', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX305', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID0', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_GSIRQ300', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSFT202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX432', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGACHD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX303', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGWAGE', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGCHKS', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSESDAY', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGPAYT', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSDX145', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX629', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX630', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSFRAUD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRACHD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXACH', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXREG', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX430', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX626', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX530', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXREL', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX450', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX451', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSPACHD', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSPX148', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ325', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX427', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSPDAY1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSW4WGE', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID2', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSGSID9', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSMIN01', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSMIN02', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ459', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBXPFL', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DESBD427', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX403', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBE405', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX405', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSRQ335', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX601', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSGSID0', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSGSID1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBX202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSFT202', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBX470', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBXREJ', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSPDAY7', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSBX122', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSRQ511', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSRQ444', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_WEEKLY_DTSRQ126', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSRQ414', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSPMON1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSCHGVB', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSCHGVR', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSVBKUP', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSVRSTR', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSRQ442', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSBX460', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSRQ513', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_MONTHLY_DTSCHGDC', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ119', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ902', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSBX500', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ417', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ320', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ713', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSBX468', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHGQ1', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHGQ2', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ327', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ328', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ412', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ793', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSWGE06', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHGRT', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSCHRGS', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ540', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRQ591', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSRTCHG', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DTSWGE01', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_QUARTERLY_DESBD426', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSACH01', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSBX415', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSBX452', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSBX453', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ120', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ123', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ125', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ305', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ306', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ308', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ311', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ410', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ411', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ423', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ426', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ429', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ439', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ602', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ606', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ607', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ609', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ611', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ612', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ717', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ718', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ720', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRQ721', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT715', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT716', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT717', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT718', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT719', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT720', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT722', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_ONDEMAND_DTSRT723', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ722', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ451', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ127', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ321', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ455', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ500', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ517', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ518', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ616', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ701', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ702', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ704', @Env = 'DEVL'; +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_YEARLY_DTSRQ910', @Env = 'DEVL'; +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/AddDailyJobSchedule.sql b/SqlAgent/01_Devl/4_Job_Maintenance/AddDailyJobSchedule.sql new file mode 100644 index 0000000..3183ffd --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/AddDailyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateDailyJobSchedule @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/AddNewJobToSQLAgent.sql b/SqlAgent/01_Devl/4_Job_Maintenance/AddNewJobToSQLAgent.sql new file mode 100644 index 0000000..743765a --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/AddNewJobToSQLAgent.sql @@ -0,0 +1,5 @@ +USE [msdb] +GO + +-- Create a job in SQL Agent (With Standard 3 steps approach) +EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX215', @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/AddWeeklyJobSchedule.sql b/SqlAgent/01_Devl/4_Job_Maintenance/AddWeeklyJobSchedule.sql new file mode 100644 index 0000000..7a1f2b5 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/AddWeeklyJobSchedule.sql @@ -0,0 +1 @@ +EXEC msdb.dbo.usp_CreateWeeklySchedules @Env = 'DEVL'; \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/01_Devl/4_Job_Maintenance/DailyJobScheduleLookup.sql new file mode 100644 index 0000000..b893457 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/DailyJobScheduleLookup.sql @@ -0,0 +1,86 @@ +/******************************************************************************************** + Section 1: Daily Job Schedule Lookup + -------------------------------------------------------------------------------------------- + Description: + Returns all SQL Agent jobs scheduled to run on a given date, along with their control + status (IsActive) and configured runtime from JobControl. + + Parameters: + @CheckDate - The date to check job schedules for. + + Notes: + • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules). + • Supports One-time, Daily, Weekly, and Monthly schedule types. + • Can easily be adapted for DEVL / TEST / PROD by changing @DbName. + +********************************************************************************************/ +USE msdb; +GO + +DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed +DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate); +DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD +DECLARE @DbName SYSNAME; + +-- Map environment to the right control DB +SET @DbName = CASE @Env + WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' + WHEN 'TEST' THEN 'TestDUTASJobSchedule' + WHEN 'PROD' THEN 'ProdDUTASJobSchedule' + END; + +DECLARE @Sql NVARCHAR(MAX); +SET @Sql = N' +SELECT + j.name AS SQLAgentJobName, + jc.JobName AS ControlJobName, + jc.ScheduledStartTime, + jc.IsActive, + s.name AS ScheduleName, + s.freq_type, + s.freq_interval, + s.freq_subday_type, + s.freq_subday_interval, + s.active_start_date, + CASE s.freq_type + WHEN 1 THEN ''One-time'' + WHEN 4 THEN ''Daily'' + WHEN 8 THEN ''Weekly'' + WHEN 16 THEN ''Monthly'' + ELSE ''Other'' + END AS FrequencyType, + CASE + WHEN s.freq_type = 1 + AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 4 + AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112)) + THEN 1 + WHEN s.freq_type = 8 -- Weekly + AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0 + THEN 1 + WHEN s.freq_type = 16 -- Monthly + AND DAY(@CheckDateParam) = s.freq_interval + THEN 1 + ELSE 0 + END AS IsScheduledToday +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name +WHERE jc.IsActive = 1 + AND ( + (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time + OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily + OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly + OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly + ) +ORDER BY jc.ScheduledStartTime; +'; + +EXEC sp_executesql + @Sql, + N'@CheckDateParam DATE, @CheckWeekdayParam INT', + @CheckDateParam = @CheckDate, + @CheckWeekdayParam = @CheckWeekday; +GO diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/DeactivateJob.sql b/SqlAgent/01_Devl/4_Job_Maintenance/DeactivateJob.sql new file mode 100644 index 0000000..3822af3 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/DeactivateJob.sql @@ -0,0 +1,12 @@ +USE DevlDUTASJobSchedule; +GO + +UPDATE dbo.JobControl +SET IsActive = 0 +WHERE Frequency = 'MONTHLY'; +GO + +-- Optional: Verify changes +SELECT JobName, Frequency, IsActive +FROM dbo.JobControl +WHERE Frequency = 'MONTHLY'; diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/DeleteSchedule.sql b/SqlAgent/01_Devl/4_Job_Maintenance/DeleteSchedule.sql new file mode 100644 index 0000000..b3cf962 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/DeleteSchedule.sql @@ -0,0 +1,27 @@ +USE msdb; +GO + +DECLARE @EnvPrefix NVARCHAR(50) = N'DEVL'; -- <<< Change this to your environment prefix +DECLARE @schedule_id INT; +DECLARE @schedule_name NVARCHAR(128); + +DECLARE Sched_Cursor CURSOR FOR +SELECT schedule_id, name +FROM msdb.dbo.sysschedules +WHERE name LIKE @EnvPrefix + '%'; -- Only schedules starting with the given prefix + +OPEN Sched_Cursor; +FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; + +WHILE @@FETCH_STATUS = 0 +BEGIN + PRINT 'Deleting schedule: ' + @schedule_name; + EXEC msdb.dbo.sp_delete_schedule @schedule_id = @schedule_id; + FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name; +END + +CLOSE Sched_Cursor; +DEALLOCATE Sched_Cursor; + +PRINT 'All SQL Agent schedules starting with prefix ' + @EnvPrefix + ' deleted successfully.'; +GO diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/01_Devl/4_Job_Maintenance/DetachDeleteScheduleByName.sql new file mode 100644 index 0000000..c337e5e --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/DetachDeleteScheduleByName.sql @@ -0,0 +1,13 @@ +-- If you know both the job name and schedule name +DECLARE @JobName NVARCHAR(100) = 'DEVL_MONTHLY_DTSCHGDC'; +DECLARE @ScheduleName NVARCHAR(200) = 'DEVL_MONTHLY_DTSCHGDC_MonthlySchedule'; +DECLARE @JobId UNIQUEIDENTIFIER; + +-- Get job ID +SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName; + +-- Detach from specific job +EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName; + +-- Then delete +EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName; diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/FederalHolidaysDML.sql b/SqlAgent/01_Devl/4_Job_Maintenance/FederalHolidaysDML.sql new file mode 100644 index 0000000..16d84eb --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/FederalHolidaysDML.sql @@ -0,0 +1,63 @@ +USE [DevlDUTASJobSchedule]; +GO + +/************************************************************************************************** +-- FILE: FederalHolidays.sql +-- PURPOSE: Manage FederalHolidays table - Create, Read, Update, Delete for a single holiday +-- TABLE: dbo.FederalHolidays +**************************************************************************************************/ + +------------------------------- +-- SELECT - View Holiday +------------------------------- +SELECT * +FROM [dbo].[FederalHolidays] +WHERE [Year] = 2025 + AND [HolidayName] = N'New Year''s Day'; +GO + +------------------------------- +-- INSERT - Create Holiday +------------------------------- +INSERT INTO [dbo].[FederalHolidays] +( + [HolidayDate], + [HolidayName], + [Year] +) +VALUES +( + '2025-01-01', -- Holiday date + N'New Year''s Day', -- Holiday name + 2025 -- Year +); +GO + +------------------------------- +-- UPDATE - Modify Holiday +------------------------------- +UPDATE [dbo].[FederalHolidays] +SET + [HolidayName] = N'New Year''s Day (Observed)', + [HolidayDate] = '2025-01-02' +WHERE + [Year] = 2025 + AND [HolidayName] = N'New Year''s Day'; +GO + +------------------------------- +-- DELETE - Remove Holiday +------------------------------- +DELETE FROM [dbo].[FederalHolidays] +WHERE [Year] = 2025 + AND [HolidayName] = N'New Year''s Day (Observed)'; +GO + +------------------------------- +-- SELECT - View Holiday +------------------------------- +SELECT * +FROM [dbo].[FederalHolidays] +WHERE [Year] = 2025 + AND [HolidayName] = N'New Year''s Day'; +GO diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/01_Devl/4_Job_Maintenance/ForceCompleteJob.sql new file mode 100644 index 0000000..9add511 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/ForceCompleteJob.sql @@ -0,0 +1,16 @@ +USE DevlDUTASJobSchedule; +GO + +-- 1. Check today's job status +SELECT JobName, Status, ErrorMessage +FROM dbo.JobExecutionHistory +WHERE RunDate = CAST(GETDATE() AS DATE) +AND JobName = 'DEVL_WEEKLY_DTSGSID1'; + +-- 2. Mark DTSBX305 as manually overridden +EXEC dbo.usp_ForceComplete 'DEVL_WEEKLY_DTSGSID1', 'Neeraj.Kumar'; + +-- 3. Verify the override +SELECT JobName, Status, OverrideBy, OverrideDate +FROM dbo.JobExecutionHistory +WHERE JobName = 'DEVL_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE); \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/GenerateJobScheduleTable.sql b/SqlAgent/01_Devl/4_Job_Maintenance/GenerateJobScheduleTable.sql new file mode 100644 index 0000000..eae7ee1 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/GenerateJobScheduleTable.sql @@ -0,0 +1,10 @@ +USE DevlDUTASJobSchedule; +GO + +-- Set Job Schedule for the Year 2025 +EXEC dbo.usp_GenerateJobSchedule @Year = 2025; +GO + +-- Set Job Schedule for the Year 2026 +EXEC dbo.usp_GenerateJobSchedule @Year = 2026; +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/JobControlDML.sql b/SqlAgent/01_Devl/4_Job_Maintenance/JobControlDML.sql new file mode 100644 index 0000000..d20db2d --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/JobControlDML.sql @@ -0,0 +1,68 @@ +USE [DevlDUTASJobSchedule]; +GO + +/************************************************************************************************** +-- FILE: JobControl.sql +-- PURPOSE: Manage JobControl table - Create, Read, Update, Delete for a single job +-- TABLE: dbo.JobControl +**************************************************************************************************/ + +------------------------------- +-- SELECT - View Job Record +------------------------------- +SELECT * +FROM [dbo].[JobControl] +WHERE [JobName] = N'PROD_DAILY_DTSBX215'; +GO + +------------------------------- +-- INSERT - Create Job Record +------------------------------- +INSERT INTO [dbo].[JobControl] +( + [JobName], + [ScheduledStartTime], + [SchedulerAction], + [IsActive], + [CreatedDate], + [Frequency], + [FrequencyPattern] +) +VALUES +( + N'PROD_DAILY_DTSBX215', -- Job name + '14:00:00', -- 2 PM (24-hour format) + N'CONTINUE', -- Action + 1, -- Active + GETDATE(), -- Current system time + N'DAILY', -- Frequency + N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}' -- JSON pattern +); +GO + +------------------------------- +-- UPDATE - Modify Job Record +------------------------------- +UPDATE [dbo].[JobControl] +SET + [ScheduledStartTime] = '15:00:00', -- Change to 3 PM + [SchedulerAction] = 'STOP', -- Change to STOP + [IsActive] = 0 -- Deactivate +WHERE + [JobName] = N'PROD_DAILY_DTSBX215'; +GO + +------------------------------- +-- DELETE - Remove Job Record +------------------------------- +DELETE FROM [dbo].[JobControl] +WHERE [JobName] = N'PROD_DAILY_DTSBX215'; +GO + +------------------------------- +-- SELECT - View Job Record +------------------------------- +SELECT * +FROM [dbo].[JobControl] +WHERE [JobName] = N'PROD_DAILY_DTSBX215'; +GO diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/JobDependenciesDML.sql b/SqlAgent/01_Devl/4_Job_Maintenance/JobDependenciesDML.sql new file mode 100644 index 0000000..364ab28 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/JobDependenciesDML.sql @@ -0,0 +1,56 @@ +USE [DevlDUTASJobSchedule]; +GO + +/************************************************************************************************** +-- FILE: JobDependencies.sql +-- PURPOSE: Manage JobDependencies table - Create, Read, Update, Delete for a single dependency +-- TABLE: dbo.JobDependencies +**************************************************************************************************/ + +------------------------------- +-- SELECT - View Dependency +------------------------------- +SELECT * +FROM [dbo].[JobDependencies] +WHERE [JobName] = N'PROD_DAILY_DTSGSID0'; +GO + +------------------------------- +-- INSERT - Create Dependency +------------------------------- +INSERT INTO [dbo].[JobDependencies] +( + [JobName], + [PredecessorJobName] +) +VALUES +( + N'PROD_DAILY_DTSGSID0', -- Dependent job + N'PROD_DAILY_DTSBX305' -- Predecessor job +); +GO + +------------------------------- +-- UPDATE - Modify Dependency +------------------------------- +UPDATE [dbo].[JobDependencies] +SET [PredecessorJobName] = N'PROD_DAILY_DTSBX215' +WHERE [JobName] = N'PROD_DAILY_DTSGSID0' + AND [PredecessorJobName] = N'PROD_DAILY_DTSBX305'; +GO + +------------------------------- +-- DELETE - Remove Dependency +------------------------------- +DELETE FROM [dbo].[JobDependencies] +WHERE [JobName] = N'PROD_DAILY_DTSGSID0' + AND [PredecessorJobName] = N'PROD_DAILY_DTSBX215'; +GO + +------------------------------- +-- SELECT - View Dependency +------------------------------- +SELECT * +FROM [dbo].[JobDependencies] +WHERE [JobName] = N'PROD_DAILY_DTSGSID0'; +GO diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/JobInfo.sql b/SqlAgent/01_Devl/4_Job_Maintenance/JobInfo.sql new file mode 100644 index 0000000..426e047 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/JobInfo.sql @@ -0,0 +1,47 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: JOB CONTROL INFORMATION'; +PRINT '================================================================================'; +GO + +-- View all active jobs +SELECT JobName, ScheduledStartTime, Frequency, IsActive +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 1 +ORDER BY Frequency, ScheduledStartTime; +GO + +-- View all inactive jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE IsActive = 0 +ORDER BY Frequency; +GO + +-- Find weekly/monthly jobs +SELECT JobName, Frequency, ScheduledStartTime +FROM DevlDUTASJobSchedule.dbo.JobControl +WHERE Frequency IN ('WEEKLY', 'MONTHLY') +ORDER BY Frequency, ScheduledStartTime; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 2: JOB DEPENDENCIES'; +PRINT '================================================================================'; +GO + +-- Check dependencies for a job +DECLARE @Job NVARCHAR(100) = 'DEVL_MONTHLY_DTSCHGVR'; +SELECT JobName, PredecessorJobName +FROM DevlDUTASJobSchedule.dbo.JobDependencies +WHERE JobName = @Job; +GO + +-- Show dependency chain overview +SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency +FROM DevlDUTASJobSchedule.dbo.JobDependencies d +JOIN DevlDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName +ORDER BY jc.Frequency, jc.ScheduledStartTime; +GO diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/01_Devl/4_Job_Maintenance/SQLAgentInfo.sql new file mode 100644 index 0000000..d63458e --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/SQLAgentInfo.sql @@ -0,0 +1,42 @@ +USE msdb; +GO + +PRINT '================================================================================'; +PRINT 'SECTION 1: SQL AGENT JOB STATUS'; +PRINT '================================================================================'; +GO + +-- List all jobs in SQL Agent +SELECT name AS JobName, enabled, date_created, date_modified +FROM msdb.dbo.sysjobs +ORDER BY name; +GO + +-- Job schedule summary +SELECT j.name AS JobName, s.name AS ScheduleName, + s.enabled, s.freq_type, s.active_start_date, s.active_start_time +FROM msdb.dbo.sysjobs j +JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id +JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id +ORDER BY j.name; +GO + +-- Last job run details +SELECT j.name AS JobName, + h.run_status, + CASE h.run_status + WHEN 0 THEN 'Failed' + WHEN 1 THEN 'Succeeded' + WHEN 2 THEN 'Retry' + WHEN 3 THEN 'Canceled' + WHEN 4 THEN 'In Progress' + END AS StatusDescription, + msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime, + h.run_duration +FROM dbo.sysjobs j +LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id +WHERE h.instance_id IN ( + SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id +) +ORDER BY RunDateTime DESC; +GO \ No newline at end of file diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/ScheduleJobsMonthly.sql b/SqlAgent/01_Devl/4_Job_Maintenance/ScheduleJobsMonthly.sql new file mode 100644 index 0000000..975520b --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/ScheduleJobsMonthly.sql @@ -0,0 +1,3 @@ +USE DevlDUTASJobSchedule; +GO +EXEC dbo.usp_ScheduleJobsForMonth; diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/TodaysExecution.sql b/SqlAgent/01_Devl/4_Job_Maintenance/TodaysExecution.sql new file mode 100644 index 0000000..3480fdd --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/TodaysExecution.sql @@ -0,0 +1,21 @@ +USE DevlDUTASJobSchedule; +GO + +DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday + +SELECT + jeh.ExecutionID, + jeh.JobName, + jeh.RunDate, + jc.ScheduledStartTime, + jeh.ActualStartTime, + jeh.ActualEndTime, + jeh.Status, + jeh.ErrorMessage, + jeh.OverrideFlag, + jeh.OverrideBy +FROM dbo.JobExecutionHistory jeh +INNER JOIN dbo.JobControl jc + ON jeh.JobName = jc.JobName +WHERE jeh.RunDate = @Runday +ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime; diff --git a/SqlAgent/01_Devl/4_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/01_Devl/4_Job_Maintenance/TriggerMissedJob.sql new file mode 100644 index 0000000..c2f3e90 --- /dev/null +++ b/SqlAgent/01_Devl/4_Job_Maintenance/TriggerMissedJob.sql @@ -0,0 +1,9 @@ +USE [DevlDUTASJobSchedule] +GO + +-- 1. Preview missed jobs (safe, no run): + EXEC dbo.usp_TriggerMissedJobs @DryRun = 1; + +-- 2. Actually trigger missed jobs: + EXEC dbo.usp_TriggerMissedJobs @DryRun = 0; + diff --git a/SqlAgent/01_Devl/5_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/01_Devl/5_PowerShell_Scripts/Execute-RemoteJob.ps1 new file mode 100644 index 0000000..742e8b3 --- /dev/null +++ b/SqlAgent/01_Devl/5_PowerShell_Scripts/Execute-RemoteJob.ps1 @@ -0,0 +1,118 @@ +param( +[Parameter(Mandatory = $true)] +[string]$JobName, + +``` +[Parameter(Mandatory = $true)] +[ValidateSet('DEVL', 'TEST', 'PROD')] +[string]$Env +``` + +) + +try { +Write-Host "Starting job $JobName in environment $Env at $(Get-Date)" + +``` +# ------------------------------------------------------------ +# Extract JCL from JobName (ENV_FREQUENCY_JOB pattern) +# ------------------------------------------------------------ +$JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', '' +Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow + +# ------------------------------------------------------------ +# Environment-specific configuration +# ------------------------------------------------------------ +switch ($Env.ToUpper()) { + 'DEVL' { + $ComputerName = '10.57.110.120' + $DatabaseName = 'DevlDUTASJobSchedule' + $SqlServer = 'DOES_DUTAS-SQL1' + } + 'TEST' { + $ComputerName = '10.57.110.141' + $DatabaseName = 'TestDUTASJobSchedule' + $SqlServer = 'DOES_DUTAS-SQL1' + } + 'PROD' { + $ComputerName = '10.57.111.120' + $DatabaseName = 'ProdDUTASJobSchedule' + $SqlServer = 'DOES_DUTAS-SQL' + } + default { + throw "Invalid environment specified: $Env" + } +} + +# ------------------------------------------------------------ +# Remote credentials (consider secure vault in production) +# ------------------------------------------------------------ +$username = "DUTASSQLAdminP@does.dcgov.priv" +$password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force +$credential = New-Object System.Management.Automation.PSCredential($username, $password) + +# ------------------------------------------------------------ +# Execute job remotely using the extracted JCL +# ------------------------------------------------------------ +Write-Host "Connecting to remote server $ComputerName ..." +$exitCode = Invoke-Command -ComputerName $ComputerName ` + -Credential $credential ` + -Authentication CredSSP ` + -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) ` + -ArgumentList $JobName, $JCL, $Env ` + -ScriptBlock { + param($JobName, $JCL, $Env) + Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env" + + $process = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" ` + -NoNewWindow -Wait -PassThru + return $process.ExitCode + } + +if (-not $exitCode) { $exitCode = 1 } # Guard for null/false exit codes + +if ($exitCode -eq 0) { + Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green +} else { + Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode" +} +``` + +} +catch { +Write-Error "Job $JobName failed with error: $($_.Exception.Message)" +$exitCode = 1 +} +finally { +# ------------------------------------------------------------ +# Log exit code to the appropriate database +# ------------------------------------------------------------ +try { +$connectionString = "Server=$SqlServer;Database=$DatabaseName;Trusted_Connection=true;" +$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString) +$connection.Open() + +``` + $command = $connection.CreateCommand() + $command.CommandText = @" + INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime) + VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE()); +``` + +"@ +$command.ExecuteNonQuery() +$connection.Close() + +``` + Write-Host "Exit code $exitCode logged to database $DatabaseName on $SqlServer for job $JobName" +} +catch { + $errorMsg = $_.Exception.Message + Write-Host "Failed to log exit code to database $DatabaseName on $SqlServer`: $errorMsg" +} +``` + +} + +exit $exitCode diff --git a/SqlAgent/01_Devl/5_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/01_Devl/5_PowerShell_Scripts/RCSubmit-Job.ps1 new file mode 100644 index 0000000..e603fc4 --- /dev/null +++ b/SqlAgent/01_Devl/5_PowerShell_Scripts/RCSubmit-Job.ps1 @@ -0,0 +1,140 @@ +param( + [string]$JobName, + [string]$Env +) + +# --- Parameter Validation --- +if (-not $JobName) { + Write-Host "JobName parameter is required" -ForegroundColor Red + exit 1 +} +if (-not $Env) { + Write-Host "Environment (Env) parameter is required" -ForegroundColor Red + exit 1 +} + +# --- Execute Job --- +Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan +$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)" +$exitCode = [int]$LASTEXITCODE +$isSuccess = 0 + +# --- Parse SYSLOG Path --- +$syslogPath = $null +$syslogFolder = "Not found" +$content = @() +$summary = @() + +try { + $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value } + + if ($syslogPath -and (Test-Path $syslogPath)) { + $syslogFolder = Split-Path $syslogPath -Parent + $content = Get-Content $syslogPath -ErrorAction Stop + $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object { + $_.Context.PostContext | Select-Object -Skip 1 -First 5 + } + } else { + Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow + $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n") + } +} +catch { + Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow + $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n") +} + +# --- Evaluate Return Codes --- +$successConditions = @( + { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 }, + { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 }, + { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 }, + { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 }, + { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 }, + { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 }, + { $JobName -eq "DTSBE405" -and $exitCode -eq 910 }, + { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 }, + { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 }, + { $exitCode -eq 0 } +) + +if ($successConditions | Where-Object { & $_ }) { + Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green + $isSuccess = 0 +} else { + Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red + $isSuccess = 1 + if ($summary.Count -eq 0) { + $summary = @($Error[0]) + } +} + +# --- Email Notification Settings --- +$smtpServer = "smtp4.dc.gov" +$fromEmail = "Dutas@dc.gov" +$toEmail = "zarath.lalputan@dc.gov" +$ccEmail = @("srujani.chandragiri@dc.gov", "neerajk@innovaconsulting.com") + +$emailBody = @" +
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code : $exitCode
+Status : $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path : $syslogFolder
+
+"@
+
+# --- Attachment Setup ---
+# Automatically attach MSGLOG.txt if it exists in the JOBLOG folder
+$attachmentPath = Join-Path $syslogFolder "MSGLOG.txt"
+
+$sendParams = @{
+ SmtpServer = $smtpServer
+ Port = 25
+ From = $fromEmail
+ To = $toEmail
+ Cc = $ccEmail
+ Subject = "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })"
+ Body = $emailBody
+ BodyAsHtml = $true
+}
+
+if (Test-Path $attachmentPath) {
+ $sendParams['Attachments'] = $attachmentPath
+ Write-Host "Attachment found: $attachmentPath" -ForegroundColor Cyan
+} else {
+ Write-Host "No MSGLOG.txt found at $syslogFolder" -ForegroundColor Yellow
+}
+
+# --- Conditional Email Sending ---
+# ===================================================================================
+# EMAIL SEND CONDITION TOGGLE:
+# By default, email will ALWAYS be sent whether the job succeeded or failed.
+# To send email ONLY if the job fails, uncomment the next line:
+# if ($isSuccess -eq 1) {
+# ===================================================================================
+
+try {
+ Write-Host "Preparing to send email to $toEmail..." -ForegroundColor Yellow
+ Send-MailMessage @sendParams
+ Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan
+}
+catch {
+ Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow
+}
+
+# ===================================================================================
+# End of email send condition block (only required if you uncomment the IF above)
+# } # End Email send condition
+# ===================================================================================
+
+Write-Host "`n---------------------------------------------"
+Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })"
+Write-Host "---------------------------------------------`n"
+
+exit $isSuccess
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/Backup-Restore-Guide.docx b/SqlAgent/01_Devl/6_Backup_Restore/Backup-Restore-Guide.docx
new file mode 100644
index 0000000..c19787a
Binary files /dev/null and b/SqlAgent/01_Devl/6_Backup_Restore/Backup-Restore-Guide.docx differ
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/Backup-SQLAgent.ps1 b/SqlAgent/01_Devl/6_Backup_Restore/Backup-SQLAgent.ps1
new file mode 100644
index 0000000..0271cda
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/Backup-SQLAgent.ps1
@@ -0,0 +1,48 @@
+# ===================================================================
+# SQL Agent Jobs Backup Script (PowerShell)
+# Modern Version using SqlServer module
+# & "E:\Neeraj\SqlAgent\v2\01_Devl\6_Backup\Backup-SQLAgent.ps1" `
+# -ServerName "DOES-DUTAS-SQL1" `
+# -BackupPath "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\"
+#
+# ===================================================================
+
+param (
+ [Parameter(Mandatory = $true)]
+ [string]$ServerName,
+
+ [Parameter(Mandatory = $true)]
+ [string]$BackupPath
+)
+
+# Load SQL Server PowerShell module
+Import-Module SqlServer -ErrorAction Stop
+
+# Create timestamp and output paths
+$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
+$ZipFile = Join-Path $BackupPath "SQLAgentJobs_$Timestamp.zip"
+
+# Ensure backup folder exists
+if (-not (Test-Path $BackupPath)) {
+ New-Item -ItemType Directory -Path $BackupPath | Out-Null
+}
+
+# Connect to SQL Server
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
+
+# Export all jobs as individual SQL scripts
+$JobFiles = @()
+foreach ($job in $server.JobServer.Jobs) {
+ $SafeJobName = ($job.Name -replace '[\\/:*?"<>|]', '_')
+ $FileName = Join-Path $BackupPath "$SafeJobName`_$Timestamp.sql"
+ $job.Script() | Out-File -FilePath $FileName -Encoding UTF8
+ $JobFiles += $FileName
+}
+
+# Compress all SQL files into a single ZIP
+Compress-Archive -Path $JobFiles -DestinationPath $ZipFile -Force
+
+# Optional: clean up individual .sql files
+# Remove-Item -Path $JobFiles
+
+Write-Host "SQL Agent jobs backup complete: $ZipFile" -ForegroundColor Green
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/BackupDB.sql b/SqlAgent/01_Devl/6_Backup_Restore/BackupDB.sql
new file mode 100644
index 0000000..1412c11
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/BackupDB.sql
@@ -0,0 +1,19 @@
+USE master;
+GO
+
+DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule';
+DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak';
+DECLARE @SQL NVARCHAR(MAX);
+
+-- Dynamic SQL for backup
+SET @SQL = '
+BACKUP DATABASE [' + @SrcDB + ']
+TO DISK = N''' + @BackupPath + '''
+WITH INIT, COMPRESSION, STATS = 10;
+';
+
+-- Execute backup
+EXEC(@SQL);
+
+PRINT 'Backup completed: ' + @BackupPath;
+GO
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/Cleanup-SQLAgent.ps1 b/SqlAgent/01_Devl/6_Backup_Restore/Cleanup-SQLAgent.ps1
new file mode 100644
index 0000000..edcb054
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/Cleanup-SQLAgent.ps1
@@ -0,0 +1,45 @@
+<#
+.SYNOPSIS
+Deletes SQL Agent jobs whose names start with a given environment prefix (e.g., DEVL, TEST, PROD).
+
+.PARAMETER ServerName
+SQL Server instance name (use FCI virtual name if clustered).
+
+.PARAMETER Env
+Environment prefix for job deletion (e.g., DEVL, TEST, PROD).
+
+.EXAMPLE
+.\Cleanup-SQLAgent.ps1 -ServerName "DOES-DUTAS-SQL1" -Env "DEVL"
+#>
+
+param (
+ [Parameter(Mandatory = $true)]
+ [string]$ServerName,
+
+ [Parameter(Mandatory = $true)]
+ [string]$Environment
+)
+
+# Load SQL Server module
+Import-Module SqlServer -ErrorAction Stop
+
+# Connect to SQL Server
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
+
+# Create log file path (same folder as script)
+$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$LogPath = Join-Path $ScriptRoot "CleanupSQLAgent_$($Environment)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
+
+"=== SQL Agent Cleanup Started for $Environment : $(Get-Date) ===" | Out-File $LogPath -Encoding UTF8
+
+# Take a snapshot of all jobs first (avoids collection modification issue)
+$jobsToDelete = @($server.JobServer.Jobs | Where-Object { $_.Name -like "$Environment*" })
+
+foreach ($job in $jobsToDelete) {
+ Write-Host "Deleting job: $($job.Name)" -ForegroundColor Yellow
+ "Deleting job: $($job.Name)" | Out-File $LogPath -Append -Encoding UTF8
+ $job.Drop()
+}
+
+"=== Cleanup Complete for $Environment : $(Get-Date) ===" | Out-File $LogPath -Append -Encoding UTF8
+Write-Host "All $Environment SQL Agent jobs deleted successfully." -ForegroundColor Green
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/CleanupSQLAgent.sql b/SqlAgent/01_Devl/6_Backup_Restore/CleanupSQLAgent.sql
new file mode 100644
index 0000000..43ff71d
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/CleanupSQLAgent.sql
@@ -0,0 +1,27 @@
+USE msdb;
+GO
+
+DECLARE @EnvPrefix NVARCHAR(50) = N'DEVL'; -- <<< Change this to your environment prefix
+DECLARE @job_id UNIQUEIDENTIFIER;
+DECLARE @job_name NVARCHAR(200);
+
+DECLARE JobCursor CURSOR FOR
+SELECT job_id, name
+FROM msdb.dbo.sysjobs
+WHERE name LIKE @EnvPrefix + '%'; -- Only jobs starting with the given prefix
+
+OPEN JobCursor;
+FETCH NEXT FROM JobCursor INTO @job_id, @job_name;
+
+WHILE @@FETCH_STATUS = 0
+BEGIN
+ PRINT 'Deleting job: ' + @job_name;
+ EXEC msdb.dbo.sp_delete_job @job_id = @job_id;
+ FETCH NEXT FROM JobCursor INTO @job_id, @job_name;
+END
+
+CLOSE JobCursor;
+DEALLOCATE JobCursor;
+
+PRINT 'All SQL Agent jobs starting with prefix ' + @EnvPrefix + ' deleted successfully.';
+GO
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 b/SqlAgent/01_Devl/6_Backup_Restore/Extract_Backup-SQLAgent.ps1
new file mode 100644
index 0000000..83fba92
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/Extract_Backup-SQLAgent.ps1
@@ -0,0 +1,8 @@
+$BackupZip = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\SQLAgentJobs_20251018_153000.zip"
+$ExtractPath = "\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Restore\"
+
+# Create folder if not exist
+if (-not (Test-Path $ExtractPath)) { New-Item -ItemType Directory -Path $ExtractPath | Out-Null }
+
+# Extract the ZIP
+Expand-Archive -Path $BackupZip -DestinationPath $ExtractPath -Force
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/RestoreDB.sql b/SqlAgent/01_Devl/6_Backup_Restore/RestoreDB.sql
new file mode 100644
index 0000000..60978a2
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/RestoreDB.sql
@@ -0,0 +1,31 @@
+USE master;
+GO
+
+DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- original database
+DECLARE @NewDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- database name to restore as
+DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-DEV\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak';
+DECLARE @SQL NVARCHAR(MAX);
+
+-- Optional: check logical file names inside backup
+-- RESTORE FILELISTONLY FROM DISK = @BackupPath;
+
+-- Dynamic SQL for restore
+SET @SQL = '
+-- Optional: disconnect active connections
+ALTER DATABASE [' + @NewDB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+
+RESTORE DATABASE [' + @NewDB + ']
+FROM DISK = N''' + @BackupPath + '''
+WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-DEV\E$\SQLData\' + @NewDB + '.mdf'',
+ MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-DEV\E$\SQLLogs\' + @NewDB + '_log.ldf'',
+ REPLACE, STATS = 10;
+
+-- Set database back to multi-user
+ALTER DATABASE [' + @NewDB + '] SET MULTI_USER;
+';
+
+-- Execute restore
+EXEC(@SQL);
+
+PRINT 'Database restored successfully as ' + @NewDB;
+GO
diff --git a/SqlAgent/01_Devl/6_Backup_Restore/RestoreSQLAgent.sql b/SqlAgent/01_Devl/6_Backup_Restore/RestoreSQLAgent.sql
new file mode 100644
index 0000000..697baeb
--- /dev/null
+++ b/SqlAgent/01_Devl/6_Backup_Restore/RestoreSQLAgent.sql
@@ -0,0 +1,12 @@
+# Connect to SQL Server
+$ServerName = "DOES-DUTAS-SQL1"
+$SqlInstance = "localhost" # or server instance name
+
+# Execute each script
+$ScriptFiles = Get-ChildItem -Path $ExtractPath -Filter *.sql
+foreach ($file in $ScriptFiles) {
+ Write-Host "Restoring job from: $($file.FullName)"
+ sqlcmd -S $SqlInstance -i $file.FullName
+}
+
+Write-Host "All SQL Agent jobs restored successfully."
diff --git a/SqlAgent/02_Test/1_Database_Setup/CreateDB.sql b/SqlAgent/02_Test/1_Database_Setup/CreateDB.sql
new file mode 100644
index 0000000..bdc31a6
--- /dev/null
+++ b/SqlAgent/02_Test/1_Database_Setup/CreateDB.sql
@@ -0,0 +1,83 @@
+-- Create the database
+CREATE DATABASE TestDUTASJobSchedule;
+GO
+
+USE TestDUTASJobSchedule;
+GO
+
+-- Create the main control table
+CREATE TABLE dbo.JobControl
+(
+ JobID INT IDENTITY(1,1) NOT NULL,
+ JobName VARCHAR(50) NOT NULL,
+ ScheduledStartTime TIME(7) NOT NULL,
+ SchedulerAction VARCHAR(10) NOT NULL, -- STOP or CONTINUE
+ IsActive BIT NOT NULL CONSTRAINT DF_JobControl_IsActive DEFAULT (1),
+ CreatedDate DATETIME NOT NULL CONSTRAINT DF_JobControl_CreatedDate DEFAULT (GETDATE()),
+ Frequency CHAR(20) NOT NULL CONSTRAINT DF_JobControl_Frequency DEFAULT ('DAILY'),
+ FrequencyPattern NVARCHAR(500) NULL, -- JSON scheduling rule
+
+ CONSTRAINT PK_JobControl PRIMARY KEY CLUSTERED (JobID ASC),
+ CONSTRAINT UQ_JobControl_JobName UNIQUE NONCLUSTERED (JobName ASC),
+ CONSTRAINT CK_JobControl_SchedulerAction CHECK (SchedulerAction IN ('STOP', 'CONTINUE'))
+);
+GO
+
+-- Create job dependencies table
+CREATE TABLE dbo.JobDependencies (
+ DependencyID INT IDENTITY(1,1) PRIMARY KEY,
+ JobName VARCHAR(50) NOT NULL,
+ PredecessorJobName VARCHAR(50) NULL,
+ FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName)
+);
+GO
+
+-- Create execution history table
+CREATE TABLE dbo.JobExecutionHistory (
+ ExecutionID INT IDENTITY(1,1) PRIMARY KEY,
+ JobName VARCHAR(50) NOT NULL,
+ RunDate DATE NOT NULL,
+ ScheduledStartTime TIME NOT NULL,
+ ActualStartTime DATETIME NULL,
+ ActualEndTime DATETIME NULL,
+ Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')),
+ ErrorMessage VARCHAR(MAX) NULL,
+ OverrideFlag BIT DEFAULT 0,
+ OverrideBy VARCHAR(100) NULL,
+ OverrideDate DATETIME NULL
+);
+GO
+
+-- Create holidays table
+CREATE TABLE dbo.FederalHolidays (
+ HolidayID INT IDENTITY(1,1) PRIMARY KEY,
+ HolidayDate DATE NOT NULL UNIQUE,
+ HolidayName VARCHAR(100) NOT NULL,
+ Year INT NOT NULL
+);
+GO
+
+-- Create Exit Code table for PowerShell Script
+CREATE TABLE dbo.JobExitCodes
+(
+ JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution
+ JobName NVARCHAR(128) NOT NULL, -- job name
+ RunDate DATE NOT NULL, -- date of execution
+ ExitCode INT NOT NULL, -- exit code from job
+ RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution
+);
+GO
+-- Create JobSchedule table
+CREATE TABLE dbo.JobSchedule (
+ JobScheduleID INT IDENTITY(1,1) PRIMARY KEY,
+ JobName VARCHAR(100) NOT NULL,
+ Frequency VARCHAR(20) CHECK (Frequency IN ('Monthly','Quarterly')),
+ ScheduledRule NVARCHAR(500) NULL, -- Copy of JSON or rule text from JobControl
+ ScheduledDate DATE NOT NULL, -- Planned date (before adjustment)
+ AdjustedRunDate DATE NOT NULL, -- Final working-day adjusted date
+ MonthOfSchedule CHAR(7) NOT NULL, -- 'YYYY-MM'
+ YearOfSchedule INT NOT NULL,
+ CreatedOn DATETIME DEFAULT GETDATE(),
+ CreatedBy VARCHAR(50) DEFAULT SUSER_SNAME()
+);
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/1_Database_Setup/InsertHolidays.sql b/SqlAgent/02_Test/1_Database_Setup/InsertHolidays.sql
new file mode 100644
index 0000000..e517718
--- /dev/null
+++ b/SqlAgent/02_Test/1_Database_Setup/InsertHolidays.sql
@@ -0,0 +1,29 @@
+USE [TestDUTASJobSchedule]
+GO
+SET IDENTITY_INSERT [dbo].[FederalHolidays] ON
+GO
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (1, CAST(N'2025-01-01' AS Date), N'New Years Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (2, CAST(N'2025-01-20' AS Date), N'Martin Luther King Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (3, CAST(N'2025-02-17' AS Date), N'Presidents Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (4, CAST(N'2025-05-26' AS Date), N'Memorial Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (5, CAST(N'2025-06-19' AS Date), N'Juneteenth Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (6, CAST(N'2025-07-04' AS Date), N'Independence Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (7, CAST(N'2025-09-01' AS Date), N'Labor Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (8, CAST(N'2025-10-13' AS Date), N'Columbus Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (9, CAST(N'2025-11-11' AS Date), N'Veterans Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (10, CAST(N'2025-11-27' AS Date), N'Thanksgiving Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (11, CAST(N'2025-12-25' AS Date), N'Christmas Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (12, CAST(N'2026-01-01' AS Date), N'New Years Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (13, CAST(N'2026-01-19' AS Date), N'Martin Luther King Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (14, CAST(N'2026-02-16' AS Date), N'Presidents Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (15, CAST(N'2026-05-25' AS Date), N'Memorial Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (16, CAST(N'2026-06-19' AS Date), N'Juneteenth Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (17, CAST(N'2026-07-03' AS Date), N'Independence Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (18, CAST(N'2026-09-07' AS Date), N'Labor Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (19, CAST(N'2026-10-12' AS Date), N'Columbus Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (20, CAST(N'2026-11-11' AS Date), N'Veterans Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (21, CAST(N'2026-11-26' AS Date), N'Thanksgiving Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (22, CAST(N'2026-12-25' AS Date), N'Christmas Day', 2026)
+GO
+SET IDENTITY_INSERT [dbo].[FederalHolidays] OFF
+GO
diff --git a/SqlAgent/02_Test/1_Database_Setup/InsertJobControl.sql b/SqlAgent/02_Test/1_Database_Setup/InsertJobControl.sql
new file mode 100644
index 0000000..119af04
--- /dev/null
+++ b/SqlAgent/02_Test/1_Database_Setup/InsertJobControl.sql
@@ -0,0 +1,143 @@
+USE [TestDUTASJobSchedule]
+GO
+SET IDENTITY_INSERT [dbo].[JobControl] ON
+GO
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (1, N'TEST_DAILY_DTSBX215', CAST(N'04:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (2, N'TEST_DAILY_DTSBX305', CAST(N'04:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (3, N'TEST_DAILY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (4, N'TEST_DAILY_GSIRQ300', CAST(N'06:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (5, N'TEST_DAILY_DTSRQ202', CAST(N'06:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (6, N'TEST_DAILY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (7, N'TEST_DAILY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (8, N'TEST_DAILY_DTSFT202', CAST(N'08:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (9, N'TEST_DAILY_DTSBX432', CAST(N'08:30:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (10, N'TEST_DAILY_DTSGACHD', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (11, N'TEST_DAILY_DTSBX303', CAST(N'10:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (12, N'TEST_DAILY_DTSGWAGE', CAST(N'14:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (13, N'TEST_DAILY_DTSGCHKS', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (14, N'TEST_DAILY_DTSESDAY', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (15, N'TEST_DAILY_DTSGPAYT', CAST(N'14:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (16, N'TEST_DAILY_DTSDX145', CAST(N'16:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (17, N'TEST_DAILY_DTSBX629', CAST(N'16:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (18, N'TEST_DAILY_DTSBX630', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (19, N'TEST_DAILY_DTSFRAUD', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (20, N'TEST_DAILY_DTSRACHD', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (21, N'TEST_DAILY_DTSBXACH', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (22, N'TEST_DAILY_DTSBXREG', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (23, N'TEST_DAILY_DTSBX430', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (24, N'TEST_DAILY_DTSBX626', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (25, N'TEST_DAILY_DTSBX530', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (26, N'TEST_DAILY_DTSBXREL', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (27, N'TEST_DAILY_DTSBX450', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (28, N'TEST_DAILY_DTSBX451', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (29, N'TEST_DAILY_DTSPACHD', CAST(N'18:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (30, N'TEST_DAILY_DTSPX148', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (31, N'TEST_DAILY_DTSRQ325', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (32, N'TEST_DAILY_DTSBX427', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (33, N'TEST_DAILY_DTSPDAY1', CAST(N'18:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (34, N'TEST_DAILY_DTSW4WGE', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (35, N'TEST_DAILY_DTSGSID2', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (36, N'TEST_DAILY_DTSGSID9', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (37, N'TEST_DAILY_DTSMIN01', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (38, N'TEST_DAILY_DTSMIN02', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (39, N'TEST_DAILY_DTSRQ459', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (40, N'TEST_DAILY_DTSBXPFL', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (41, N'TEST_DAILY_DESBD427', CAST(N'19:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (42, N'TEST_DAILY_DTSBX403', CAST(N'20:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (43, N'TEST_DAILY_DTSBE405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (44, N'TEST_DAILY_DTSBX405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (45, N'TEST_DAILY_DTSRQ335', CAST(N'21:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (46, N'TEST_DAILY_DTSBX601', CAST(N'21:25:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (47, N'TEST_WEEKLY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (48, N'TEST_WEEKLY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (49, N'TEST_WEEKLY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (50, N'TEST_WEEKLY_DTSFT202', CAST(N'08:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (51, N'TEST_WEEKLY_DTSBX470', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (52, N'TEST_WEEKLY_DTSBXREJ', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Tue","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (53, N'TEST_WEEKLY_DTSPDAY7', CAST(N'19:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (54, N'TEST_WEEKLY_DTSBX122', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (55, N'TEST_WEEKLY_DTSRQ511', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (56, N'TEST_WEEKLY_DTSRQ444', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (57, N'TEST_WEEKLY_DTSRQ126', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (58, N'TEST_MONTHLY_DTSRQ414', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (59, N'TEST_MONTHLY_DTSPMON1', CAST(N'19:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (60, N'TEST_MONTHLY_DTSCHGVB', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (61, N'TEST_MONTHLY_DTSCHGVR', CAST(N'19:27:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (62, N'TEST_MONTHLY_DTSVBKUP', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (63, N'TEST_MONTHLY_DTSVRSTR', CAST(N'19:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (64, N'TEST_MONTHLY_DTSRQ442', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (65, N'TEST_MONTHLY_DTSBX460', CAST(N'19:35:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (66, N'TEST_MONTHLY_DTSRQ513', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (67, N'TEST_MONTHLY_DTSCHGDC', CAST(N'13:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (68, N'TEST_QUARTERLY_DTSRQ119', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":3}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (69, N'TEST_QUARTERLY_DTSRQ902', CAST(N'18:16:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (70, N'TEST_QUARTERLY_DTSBX500', CAST(N'21:25:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (71, N'TEST_QUARTERLY_DTSRQ417', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":31},{"Month":8,"Day":31},{"Month":11,"Day":30}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (72, N'TEST_QUARTERLY_DTSRQ320', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":10},{"Month":5,"Day":10},{"Month":8,"Day":10},{"Month":11,"Day":10}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (73, N'TEST_QUARTERLY_DTSRQ713', CAST(N'00:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":3,"Day":31},{"Month":6,"Day":30},{"Month":9,"Day":30},{"Month":12,"Day":31}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (74, N'TEST_QUARTERLY_DTSBX468', CAST(N'15:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":30},{"Month":7,"Day":31},{"Month":10,"Day":30}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (75, N'TEST_QUARTERLY_DTSCHGQ1', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (76, N'TEST_QUARTERLY_DTSCHGQ2', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (77, N'TEST_QUARTERLY_DTSRQ327', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (78, N'TEST_QUARTERLY_DTSRQ328', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (79, N'TEST_QUARTERLY_DTSRQ412', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":1,"Day":15},{"Month":4,"Day":15},{"Month":7,"Day":15},{"Month":10,"Day":15}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (80, N'TEST_QUARTERLY_DTSRQ793', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (81, N'TEST_QUARTERLY_DTSWGE06', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (82, N'TEST_QUARTERLY_DTSCHGRT', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (83, N'TEST_QUARTERLY_DTSCHRGS', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (84, N'TEST_QUARTERLY_DTSRQ540', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (85, N'TEST_QUARTERLY_DTSRQ591', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (86, N'TEST_QUARTERLY_DTSRTCHG', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (87, N'TEST_QUARTERLY_DTSWGE01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (88, N'TEST_QUARTERLY_DESBD426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (89, N'TEST_ONDEMAND_DTSACH01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (90, N'TEST_ONDEMAND_DTSBX415', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (91, N'TEST_ONDEMAND_DTSBX452', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (92, N'TEST_ONDEMAND_DTSBX453', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (93, N'TEST_ONDEMAND_DTSRQ120', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (94, N'TEST_ONDEMAND_DTSRQ123', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (95, N'TEST_ONDEMAND_DTSRQ125', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (96, N'TEST_ONDEMAND_DTSRQ305', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (97, N'TEST_ONDEMAND_DTSRQ306', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (98, N'TEST_ONDEMAND_DTSRQ308', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (99, N'TEST_ONDEMAND_DTSRQ311', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (100, N'TEST_ONDEMAND_DTSRQ410', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (101, N'TEST_ONDEMAND_DTSRQ411', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (102, N'TEST_ONDEMAND_DTSRQ423', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (103, N'TEST_ONDEMAND_DTSRQ426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (104, N'TEST_ONDEMAND_DTSRQ429', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (105, N'TEST_ONDEMAND_DTSRQ439', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (106, N'TEST_ONDEMAND_DTSRQ602', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (107, N'TEST_ONDEMAND_DTSRQ606', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (108, N'TEST_ONDEMAND_DTSRQ607', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (109, N'TEST_ONDEMAND_DTSRQ609', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (110, N'TEST_ONDEMAND_DTSRQ611', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (111, N'TEST_ONDEMAND_DTSRQ612', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (112, N'TEST_ONDEMAND_DTSRQ717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (113, N'TEST_ONDEMAND_DTSRQ718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (114, N'TEST_ONDEMAND_DTSRQ720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (115, N'TEST_ONDEMAND_DTSRQ721', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (116, N'TEST_ONDEMAND_DTSRT715', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (117, N'TEST_ONDEMAND_DTSRT716', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (118, N'TEST_ONDEMAND_DTSRT717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (119, N'TEST_ONDEMAND_DTSRT718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (120, N'TEST_ONDEMAND_DTSRT719', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (121, N'TEST_ONDEMAND_DTSRT720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (122, N'TEST_ONDEMAND_DTSRT722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (123, N'TEST_ONDEMAND_DTSRT723', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (124, N'TEST_YEARLY_DTSRQ722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (125, N'TEST_YEARLY_DTSRQ451', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (126, N'TEST_YEARLY_DTSRQ127', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (127, N'TEST_YEARLY_DTSRQ321', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (128, N'TEST_YEARLY_DTSRQ455', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (129, N'TEST_YEARLY_DTSRQ500', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (130, N'TEST_YEARLY_DTSRQ517', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (131, N'TEST_YEARLY_DTSRQ518', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (132, N'TEST_YEARLY_DTSRQ616', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (133, N'TEST_YEARLY_DTSRQ701', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (134, N'TEST_YEARLY_DTSRQ702', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (135, N'TEST_YEARLY_DTSRQ704', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (136, N'TEST_YEARLY_DTSRQ910', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+GO
+SET IDENTITY_INSERT [dbo].[JobControl] OFF
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/02_Test/1_Database_Setup/InsertJobDependencies.sql
new file mode 100644
index 0000000..0f84ae3
--- /dev/null
+++ b/SqlAgent/02_Test/1_Database_Setup/InsertJobDependencies.sql
@@ -0,0 +1,92 @@
+USE [TestDUTASJobSchedule]
+GO
+SET IDENTITY_INSERT [dbo].[JobDependencies] ON
+GO
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (1, N'TEST_DAILY_DTSGSID0', N'TEST_DAILY_DTSBX305')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (2, N'TEST_DAILY_GSIRQ300', N'TEST_DAILY_DTSBX305')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (3, N'TEST_DAILY_DTSRQ202', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (4, N'TEST_DAILY_DTSGSID1', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (5, N'TEST_DAILY_DTSBX202', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (6, N'TEST_DAILY_DTSFT202', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (7, N'TEST_DAILY_DTSBX432', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (8, N'TEST_DAILY_DTSGACHD', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (9, N'TEST_DAILY_DTSBX303', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (10, N'TEST_DAILY_DTSGWAGE', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (11, N'TEST_DAILY_DTSGCHKS', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (12, N'TEST_DAILY_DTSESDAY', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (13, N'TEST_DAILY_DTSGPAYT', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (14, N'TEST_DAILY_DTSDX145', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (15, N'TEST_DAILY_DTSBX629', N'TEST_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (16, N'TEST_DAILY_DTSBX630', N'TEST_DAILY_DTSBX629')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (17, N'TEST_DAILY_DTSFRAUD', N'TEST_DAILY_DTSBX629')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (18, N'TEST_DAILY_DTSRACHD', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (19, N'TEST_DAILY_DTSBXACH', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (20, N'TEST_DAILY_DTSBXREG', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (21, N'TEST_DAILY_DTSBX430', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (22, N'TEST_DAILY_DTSBX626', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (23, N'TEST_DAILY_DTSBX530', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (24, N'TEST_DAILY_DTSBXREL', N'TEST_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (25, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBXACH')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (26, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBXREG')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (27, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBX430')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (28, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBX626')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (29, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBX530')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (30, N'TEST_DAILY_DTSBX450', N'TEST_DAILY_DTSBXREL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (31, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBXACH')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (32, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBXREG')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (33, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBX430')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (34, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBX626')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (35, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBX530')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (36, N'TEST_DAILY_DTSBX451', N'TEST_DAILY_DTSBXREL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (37, N'TEST_DAILY_DTSPACHD', N'TEST_DAILY_DTSBX450')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (38, N'TEST_DAILY_DTSPACHD', N'TEST_DAILY_DTSBX451')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (39, N'TEST_DAILY_DTSPX148', N'TEST_DAILY_DTSPACHD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (40, N'TEST_DAILY_DTSRQ325', N'TEST_DAILY_DTSPACHD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (41, N'TEST_DAILY_DTSBX427', N'TEST_DAILY_DTSPX148')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (42, N'TEST_DAILY_DTSBX427', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (43, N'TEST_DAILY_DTSPDAY1', N'TEST_DAILY_DTSBX427')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (44, N'TEST_DAILY_DTSW4WGE', N'TEST_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (45, N'TEST_DAILY_DTSGSID2', N'TEST_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (46, N'TEST_DAILY_DTSGSID9', N'TEST_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (47, N'TEST_DAILY_DTSMIN01', N'TEST_DAILY_DTSW4WGE')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (48, N'TEST_DAILY_DTSMIN01', N'TEST_DAILY_DTSGSID2')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (49, N'TEST_DAILY_DTSMIN01', N'TEST_DAILY_DTSGSID9')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (50, N'TEST_DAILY_DTSMIN02', N'TEST_DAILY_DTSW4WGE')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (51, N'TEST_DAILY_DTSMIN02', N'TEST_DAILY_DTSGSID2')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (52, N'TEST_DAILY_DTSMIN02', N'TEST_DAILY_DTSGSID9')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (53, N'TEST_DAILY_DTSRQ459', N'TEST_DAILY_DTSMIN01')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (54, N'TEST_DAILY_DTSRQ459', N'TEST_DAILY_DTSMIN02')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (55, N'TEST_DAILY_DTSBXPFL', N'TEST_DAILY_DTSRQ459')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (56, N'TEST_DAILY_DESBD427', N'TEST_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (57, N'TEST_DAILY_DTSBX403', N'TEST_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (58, N'TEST_DAILY_DTSBE405', N'TEST_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (59, N'TEST_DAILY_DTSBX405', N'TEST_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (60, N'TEST_DAILY_DTSRQ335', N'TEST_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (61, N'TEST_DAILY_DTSBX601', N'TEST_DAILY_DTSRQ335')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (62, N'TEST_WEEKLY_DTSBXREJ', N'TEST_DAILY_DTSBXREL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (63, N'TEST_WEEKLY_DTSBX122', N'TEST_WEEKLY_DTSPDAY7')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (64, N'TEST_WEEKLY_DTSRQ511', N'TEST_WEEKLY_DTSPDAY7')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (65, N'TEST_MONTHLY_DTSRQ414', N'TEST_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (66, N'TEST_MONTHLY_DTSCHGVB', N'TEST_MONTHLY_DTSPMON1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (67, N'TEST_MONTHLY_DTSCHGVR', N'TEST_MONTHLY_DTSCHGVB')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (68, N'TEST_MONTHLY_DTSVBKUP', N'TEST_MONTHLY_DTSPMON1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (69, N'TEST_MONTHLY_DTSVRSTR', N'TEST_MONTHLY_DTSVBKUP')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (70, N'TEST_MONTHLY_DTSRQ442', N'TEST_MONTHLY_DTSRQ513')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (71, N'TEST_QUARTERLY_DTSRQ119', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (72, N'TEST_QUARTERLY_DTSRQ417', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (73, N'TEST_QUARTERLY_DTSRQ320', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (74, N'TEST_QUARTERLY_DTSRQ793', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (75, N'TEST_QUARTERLY_DTSCHGQ1', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (76, N'TEST_QUARTERLY_DTSRQ327', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (77, N'TEST_QUARTERLY_DTSRQ412', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (78, N'TEST_QUARTERLY_DTSRQ591', N'TEST_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (79, N'TEST_QUARTERLY_DTSRQ902', N'TEST_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (80, N'TEST_QUARTERLY_DTSCHGQ2', N'TEST_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (81, N'TEST_QUARTERLY_DTSCHGRT', N'TEST_QUARTERLY_DTSRQ591')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (82, N'TEST_QUARTERLY_DTSRQ328', N'TEST_QUARTERLY_DTSRQ327')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (83, N'TEST_QUARTERLY_DTSBX500', N'TEST_QUARTERLY_DTSRQ417')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (84, N'TEST_QUARTERLY_DTSRQ713', N'TEST_MONTHLY_DTSPMON1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (85, N'TEST_QUARTERLY_DTSCHRGS', N'TEST_QUARTERLY_DTSCHGRT')
+GO
+SET IDENTITY_INSERT [dbo].[JobDependencies] OFF
+GO
diff --git a/SqlAgent/02_Test/2_Functions/fn_GetNextWorkday.sql b/SqlAgent/02_Test/2_Functions/fn_GetNextWorkday.sql
new file mode 100644
index 0000000..6f2e39a
--- /dev/null
+++ b/SqlAgent/02_Test/2_Functions/fn_GetNextWorkday.sql
@@ -0,0 +1,17 @@
+USE TestDUTASJobSchedule;
+GO
+-- Returns the next valid workday on or after the given date
+CREATE OR ALTER FUNCTION dbo.fn_GetNextWorkday (@InputDate DATE)
+RETURNS DATE
+AS
+BEGIN
+ DECLARE @Workday DATE = @InputDate;
+
+ WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday)
+ BEGIN
+ SET @Workday = DATEADD(DAY, 1, @Workday);
+ END
+
+ RETURN @Workday;
+END;
diff --git a/SqlAgent/02_Test/2_Functions/fn_GetPreviousWorkday.sql b/SqlAgent/02_Test/2_Functions/fn_GetPreviousWorkday.sql
new file mode 100644
index 0000000..88aab72
--- /dev/null
+++ b/SqlAgent/02_Test/2_Functions/fn_GetPreviousWorkday.sql
@@ -0,0 +1,17 @@
+USE TestDUTASJobSchedule;
+GO
+-- Returns the most recent valid workday before or equal to the given date
+CREATE OR ALTER FUNCTION dbo.fn_GetPreviousWorkday (@InputDate DATE)
+RETURNS DATE
+AS
+BEGIN
+ DECLARE @Workday DATE = @InputDate;
+
+ WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday)
+ BEGIN
+ SET @Workday = DATEADD(DAY, -1, @Workday);
+ END
+
+ RETURN @Workday;
+END;
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_CheckJobConditions.sql
new file mode 100644
index 0000000..42f3b01
Binary files /dev/null and b/SqlAgent/02_Test/3_Stored_Procedures/usp_CheckJobConditions.sql differ
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql
new file mode 100644
index 0000000..d009605
Binary files /dev/null and b/SqlAgent/02_Test/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql
new file mode 100644
index 0000000..c2cd1ea
--- /dev/null
+++ b/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql
@@ -0,0 +1,98 @@
+USE msdb;
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_CreateDailyJobSchedule
+ @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE
+ @JobID INT,
+ @JobName SYSNAME,
+ @ScheduledStartTime TIME(0),
+ @Frequency NVARCHAR(20),
+ @FrequencyPattern NVARCHAR(MAX),
+ @ScheduleName SYSNAME,
+ @StartTimeInt INT,
+ @FreqInterval INT,
+ @TimeString VARCHAR(8),
+ @ActiveStartDate INT,
+ @dbName SYSNAME; -- Added variable for database name
+
+ -- Determine database name based on environment
+ SET @dbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ END;
+
+ -- Prepare active start date as INT (YYYYMMDD)
+ SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112));
+
+ -- Dynamic SQL to fetch jobs from the appropriate database
+ DECLARE @Sql NVARCHAR(MAX);
+ SET @Sql = N'
+ DECLARE job_cursor CURSOR FOR
+ SELECT JobID, JobName, ScheduledStartTime, Frequency, FrequencyPattern
+ FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl
+ WHERE UPPER(Frequency) = ''DAILY''
+ AND IsActive = 1;';
+
+ -- Execute dynamic SQL to declare cursor
+ EXEC sp_executesql @Sql;
+
+ OPEN job_cursor;
+ FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ -- Step 1: Convert ScheduledStartTime (TIME) to HH:MM:SS string
+ SET @TimeString = CONVERT(VARCHAR(8), @ScheduledStartTime, 108);
+
+ -- Step 2: Remove colons and convert to INT (HHMMSS)
+ SET @StartTimeInt = CONVERT(INT, REPLACE(@TimeString, ':', ''));
+
+ -- Step 3: Prepare schedule name
+ SET @ScheduleName = CONCAT(@JobName, '_DailySchedule');
+
+ -- Step 4: Fixed freq_interval for Monday to Friday
+ SET @FreqInterval = 62; -- Mon(2)+Tue(4)+Wed(8)+Thu(16)+Fri(32) = 62
+
+ -- Step 5: Delete existing schedule if it exists (idempotency)
+ IF EXISTS (
+ SELECT 1
+ FROM msdb.dbo.sysschedules s
+ JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id
+ JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id
+ WHERE j.name = @JobName AND s.name = @ScheduleName
+ )
+ BEGIN
+ EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName;
+ END
+
+ -- Step 6: Create weekly schedule (Monday to Friday) running once per day
+ EXEC msdb.dbo.sp_add_schedule
+ @schedule_name = @ScheduleName,
+ @enabled = 1,
+ @freq_type = 8, -- weekly
+ @freq_interval = @FreqInterval,
+ @freq_recurrence_factor = 1, -- every week
+ @active_start_time = @StartTimeInt,
+ @active_start_date = @ActiveStartDate;
+
+ -- Step 7: Attach schedule to job
+ EXEC msdb.dbo.sp_attach_schedule
+ @job_name = @JobName,
+ @schedule_name = @ScheduleName;
+
+ -- Fetch next job
+ FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern;
+ END
+
+ CLOSE job_cursor;
+ DEALLOCATE job_cursor;
+
+ PRINT 'Daily job schedules (Monday to Friday) created successfully for ' + @dbName;
+END;
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql
new file mode 100644
index 0000000..cfba9e9
Binary files /dev/null and b/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateSQLAgentJob.sql differ
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateWeeklySchedules.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateWeeklySchedules.sql
new file mode 100644
index 0000000..2021821
--- /dev/null
+++ b/SqlAgent/02_Test/3_Stored_Procedures/usp_CreateWeeklySchedules.sql
@@ -0,0 +1,223 @@
+USE [msdb];
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_CreateWeeklySchedules
+ @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE
+ @JobName SYSNAME,
+ @FrequencyPattern NVARCHAR(MAX),
+ @StartTime VARCHAR(50),
+ @ScheduleName SYSNAME,
+ @StartTimeInt INT,
+ @FreqInterval INT,
+ @ActiveDate INT,
+ @computedFreq INT,
+ @dbName SYSNAME; -- Added variable for database name
+
+ -- Determine database name based on environment
+ SET @dbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ END;
+
+ SET @ActiveDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112));
+
+ --------------------------------------------------------------------------
+ -- Dynamic SQL for cursor to fetch active weekly jobs from appropriate database
+ --------------------------------------------------------------------------
+ DECLARE @Sql NVARCHAR(MAX);
+ SET @Sql = N'
+ DECLARE job_cursor CURSOR FAST_FORWARD FOR
+ SELECT
+ JobName,
+ FrequencyPattern,
+ ScheduledStartTime
+ FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl
+ WHERE UPPER(Frequency) = ''WEEKLY''
+ AND IsActive = 1;';
+
+ -- Execute dynamic SQL to declare cursor
+ EXEC sp_executesql @Sql;
+
+ OPEN job_cursor;
+ FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ BEGIN TRY
+ ------------------------------------------------------------------
+ -- Reset per-job variables
+ ------------------------------------------------------------------
+ SET @FreqInterval = 0;
+ SET @computedFreq = 0;
+ SET @StartTimeInt = NULL;
+ SET @ScheduleName = NULL;
+
+ ------------------------------------------------------------------
+ -- Correctly format the start time (HHMMSS without extra zeros)
+ ------------------------------------------------------------------
+ SET @StartTime = LTRIM(RTRIM(ISNULL(@StartTime, '00:00:00')));
+
+ -- Parse time and convert to HHMMSS integer
+ DECLARE @TimeParts TABLE (part NVARCHAR(10), idx INT);
+ INSERT INTO @TimeParts (part, idx)
+ SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1
+ FROM STRING_SPLIT(LEFT(@StartTime, 8), ':');
+
+ DECLARE @Hours INT, @Minutes INT, @Seconds INT;
+
+ SELECT @Hours = CAST(part AS INT) FROM @TimeParts WHERE idx = 0;
+ SELECT @Minutes = CAST(part AS INT) FROM @TimeParts WHERE idx = 1;
+ SELECT @Seconds = CAST(part AS INT) FROM @TimeParts WHERE idx = 2;
+
+ -- Ensure valid time ranges
+ SET @Hours = ISNULL(@Hours, 0);
+ SET @Minutes = ISNULL(@Minutes, 0);
+ SET @Seconds = ISNULL(@Seconds, 0);
+
+ IF @Hours < 0 OR @Hours > 23 SET @Hours = 0;
+ IF @Minutes < 0 OR @Minutes > 59 SET @Minutes = 0;
+ IF @Seconds < 0 OR @Seconds > 59 SET @Seconds = 0;
+
+ SET @StartTimeInt = (@Hours * 10000) + (@Minutes * 100) + @Seconds;
+
+ SET @ScheduleName = CONCAT(@JobName, '_WeeklySchedule');
+
+ ------------------------------------------------------------------
+ -- Parse JSON days using a local temporary table
+ ------------------------------------------------------------------
+ CREATE TABLE #Days (DayName NVARCHAR(10));
+
+ INSERT INTO #Days (DayName)
+ SELECT TRIM(value)
+ FROM OPENJSON(ISNULL(@FrequencyPattern, '{}'), '$.Days');
+
+ ------------------------------------------------------------------
+ -- Compute bitmask correctly (values should be 1-127)
+ ------------------------------------------------------------------
+ SELECT @computedFreq = ISNULL(SUM(
+ CASE UPPER(DayName)
+ WHEN 'SUN' THEN 1
+ WHEN 'MON' THEN 2
+ WHEN 'TUE' THEN 4
+ WHEN 'WED' THEN 8
+ WHEN 'THU' THEN 16
+ WHEN 'FRI' THEN 32
+ WHEN 'SAT' THEN 64
+ ELSE 0
+ END
+ ), 0)
+ FROM #Days;
+
+ DROP TABLE #Days; -- Explicitly drop the temp table
+
+ SET @FreqInterval = ISNULL(@computedFreq, 0);
+
+ ------------------------------------------------------------------
+ -- Validate freq_interval (must be 1..127)
+ ------------------------------------------------------------------
+ IF @FreqInterval < 1 OR @FreqInterval > 127
+ BEGIN
+ PRINT 'Warning: Weekly job ' + @JobName +
+ ' has invalid freq_interval (' + ISNULL(CAST(@FreqInterval AS VARCHAR(10)), 'NULL') +
+ '). Days found: ' + ISNULL(@FrequencyPattern, 'None') + '. Skipping.';
+ FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime;
+ CONTINUE;
+ END
+
+ ------------------------------------------------------------------
+ -- Debug output to verify calculations
+ ------------------------------------------------------------------
+ PRINT 'Job: ' + @JobName +
+ ', Days: ' + @FrequencyPattern +
+ ', FreqInterval: ' + CAST(@FreqInterval AS VARCHAR(3)) +
+ ', StartTime: ' + CAST(@StartTimeInt AS VARCHAR(6));
+
+ ------------------------------------------------------------------
+ -- Safely detach and delete any existing schedule with this name
+ -- Use TRY/CATCH for schedule operations since non-existence is expected
+ ------------------------------------------------------------------
+ BEGIN TRY
+ DECLARE @schedule_id INT;
+ DECLARE @attach_count INT;
+
+ -- Check if schedule exists and get its ID
+ SELECT @schedule_id = s.schedule_id
+ FROM msdb.dbo.sysschedules s
+ JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id
+ JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id
+ WHERE j.name = @JobName AND s.name = @ScheduleName;
+
+ IF @schedule_id IS NOT NULL
+ BEGIN
+ -- Detach from this job (if attached)
+ EXEC msdb.dbo.sp_detach_schedule
+ @job_name = @JobName,
+ @schedule_name = @ScheduleName;
+
+ -- Check if schedule still attached to other jobs
+ SELECT @attach_count = COUNT(*)
+ FROM msdb.dbo.sysjobschedules js
+ WHERE js.schedule_id = @schedule_id;
+
+ IF @attach_count = 0
+ BEGIN
+ EXEC msdb.dbo.sp_delete_schedule
+ @schedule_name = @ScheduleName;
+ PRINT 'Existing schedule deleted: ' + @ScheduleName;
+ END
+ ELSE
+ BEGIN
+ PRINT 'Notice: schedule ' + @ScheduleName + ' could not be deleted because it is still attached to other jobs.';
+ END
+ END
+ END TRY
+ BEGIN CATCH
+ -- Schedule operations might fail if schedule doesn't exist, which is fine
+ PRINT 'Notice: ' + ERROR_MESSAGE() + ' - proceeding with new schedule creation.';
+ END CATCH
+
+ ------------------------------------------------------------------
+ -- Create the unified weekly schedule with subday config
+ ------------------------------------------------------------------
+ EXEC msdb.dbo.sp_add_schedule
+ @schedule_name = @ScheduleName,
+ @enabled = 1,
+ @freq_type = 8, -- Weekly
+ @freq_interval = @FreqInterval, -- Bitmask of weekdays
+ @freq_recurrence_factor = 1, -- Every week
+ @freq_subday_type = 1, -- Once per day
+ @freq_subday_interval = 1,
+ @active_start_time = @StartTimeInt,
+ @active_start_date = @ActiveDate;
+
+ ------------------------------------------------------------------
+ -- Attach the schedule to the job
+ ------------------------------------------------------------------
+ EXEC msdb.dbo.sp_attach_schedule
+ @job_name = @JobName,
+ @schedule_name = @ScheduleName;
+
+ PRINT 'Weekly schedule created for job: ' + @JobName +
+ ' (Days=' + CAST(@FreqInterval AS VARCHAR(10)) +
+ ', Time=' + RIGHT('000000' + CAST(@StartTimeInt AS VARCHAR(6)), 6) + ')';
+
+ END TRY
+ BEGIN CATCH
+ PRINT 'Error scheduling job ' + ISNULL(@JobName, 'Unknown') + ': ' + ERROR_MESSAGE();
+ END CATCH;
+
+ FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime;
+ END
+
+ CLOSE job_cursor;
+ DEALLOCATE job_cursor;
+
+ PRINT 'All weekly job schedules processed for ' + @dbName;
+END;
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_ForceComplete.sql
new file mode 100644
index 0000000..3b107b2
Binary files /dev/null and b/SqlAgent/02_Test/3_Stored_Procedures/usp_ForceComplete.sql differ
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_GenerateJobSchedule.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_GenerateJobSchedule.sql
new file mode 100644
index 0000000..de09cab
--- /dev/null
+++ b/SqlAgent/02_Test/3_Stored_Procedures/usp_GenerateJobSchedule.sql
@@ -0,0 +1,261 @@
+USE [TestDUTASJobSchedule];
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_GenerateJobSchedule
+ @Year INT
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ -------------------------------------------------------------------------
+ -- 1. Cleanup existing schedule data for this year
+ -------------------------------------------------------------------------
+ DELETE FROM dbo.JobSchedule WHERE YearOfSchedule = @Year;
+
+ -------------------------------------------------------------------------
+ -- 2. Variable declarations
+ -------------------------------------------------------------------------
+ DECLARE
+ @JobName VARCHAR(100),
+ @Frequency VARCHAR(20),
+ @Pattern NVARCHAR(2000),
+ @ScheduledTime TIME,
+ @RuleName NVARCHAR(100),
+ @Month INT,
+ @BaseDate DATE,
+ @ScheduledDate DATE,
+ @AdjustedDate DATE,
+ @FailSafeDate DATE = '9999-12-31';
+
+ -------------------------------------------------------------------------
+ -- 3. Temporary table to process jobs more efficiently
+ -------------------------------------------------------------------------
+ CREATE TABLE #JobProcessing (
+ JobName VARCHAR(100),
+ Frequency VARCHAR(20),
+ Pattern NVARCHAR(2000),
+ ScheduledTime TIME,
+ RuleName NVARCHAR(100),
+ MonthsJSON NVARCHAR(MAX),
+ DayNum INT,
+ HasExplicitSchedule BIT
+ );
+
+ -- Populate temporary table with parsed JSON data
+ INSERT INTO #JobProcessing (JobName, Frequency, Pattern, ScheduledTime, RuleName, MonthsJSON, DayNum, HasExplicitSchedule)
+ SELECT
+ jc.JobName,
+ jc.Frequency,
+ jc.FrequencyPattern,
+ jc.ScheduledStartTime,
+ JSON_VALUE(jc.FrequencyPattern, '$.Rule'),
+ JSON_QUERY(jc.FrequencyPattern, '$.Months'),
+ JSON_VALUE(jc.FrequencyPattern, '$.Day'),
+ CASE WHEN JSON_QUERY(jc.FrequencyPattern, '$.Schedule') IS NOT NULL THEN 1 ELSE 0 END
+ FROM dbo.JobControl jc
+ WHERE UPPER(jc.Frequency) IN ('MONTHLY','QUARTERLY')
+ AND jc.IsActive = 1;
+
+ -------------------------------------------------------------------------
+ -- 4. Process MONTHLY jobs
+ -------------------------------------------------------------------------
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ CASE
+ WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1))
+ WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1)))
+ ELSE @FailSafeDate
+ END AS ScheduledDate,
+ CASE
+ WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1))
+ WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1)))
+ ELSE @FailSafeDate
+ END AS AdjustedRunDate,
+ FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum)
+ WHERE jp.Frequency = 'MONTHLY'
+ AND jp.RuleName IN ('FirstWorkday', 'LastWorkday');
+
+ -- Handle monthly jobs with unknown rules
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ @FailSafeDate,
+ @FailSafeDate,
+ FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum)
+ WHERE jp.Frequency = 'MONTHLY'
+ AND jp.RuleName NOT IN ('FirstWorkday', 'LastWorkday');
+
+ -------------------------------------------------------------------------
+ -- 5. Process QUARTERLY jobs - FirstWorkdayOfQuarter
+ -------------------------------------------------------------------------
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)),
+ dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)),
+ FORMAT(DATEFROMPARTS(@Year, q.StartMonth, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ CROSS JOIN (VALUES (1),(4),(7),(10)) q(StartMonth)
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND jp.RuleName = 'FirstWorkdayOfQuarter';
+
+ -------------------------------------------------------------------------
+ -- 6. Process QUARTERLY jobs - Months array with Day number
+ -------------------------------------------------------------------------
+ ;WITH QuarterlyMonths AS (
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ CAST(m.[value] AS INT) AS MonthNum,
+ jp.DayNum
+ FROM #JobProcessing jp
+ CROSS APPLY OPENJSON(jp.MonthsJSON) m
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND jp.MonthsJSON IS NOT NULL
+ AND jp.DayNum IS NOT NULL
+ AND jp.RuleName IS NULL
+ AND jp.HasExplicitSchedule = 0
+ ),
+ QuarterlyDates AS (
+ SELECT
+ qm.JobName,
+ qm.Frequency,
+ qm.Pattern,
+ qm.MonthNum,
+ qm.DayNum,
+ CASE
+ WHEN qm.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1)))
+ THEN DATEFROMPARTS(@Year, qm.MonthNum, qm.DayNum)
+ ELSE EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1))
+ END AS BaseDate
+ FROM QuarterlyMonths qm
+ )
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ qd.JobName,
+ qd.Frequency,
+ qd.Pattern,
+ qd.BaseDate,
+ CASE
+ WHEN DATENAME(WEEKDAY, qd.BaseDate) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = qd.BaseDate)
+ THEN dbo.fn_GetPreviousWorkday(qd.BaseDate)
+ ELSE qd.BaseDate
+ END AS AdjustedRunDate,
+ FORMAT(qd.BaseDate, 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM QuarterlyDates qd;
+
+ -------------------------------------------------------------------------
+ -- 7. Process QUARTERLY jobs - Explicit Schedule array
+ -------------------------------------------------------------------------
+ ;WITH ExplicitSchedules AS (
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ s.[Month] AS MonthNum,
+ s.[Day] AS DayNum
+ FROM #JobProcessing jp
+ CROSS APPLY OPENJSON(jp.Pattern, '$.Schedule')
+ WITH (
+ [Month] INT '$.Month',
+ [Day] INT '$.Day'
+ ) s
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND jp.HasExplicitSchedule = 1
+ ),
+ ExplicitScheduleDates AS (
+ SELECT
+ es.JobName,
+ es.Frequency,
+ es.Pattern,
+ es.MonthNum,
+ es.DayNum,
+ CASE
+ WHEN es.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1)))
+ THEN DATEFROMPARTS(@Year, es.MonthNum, es.DayNum)
+ ELSE EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1))
+ END AS BaseDate
+ FROM ExplicitSchedules es
+ )
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ esd.JobName,
+ esd.Frequency,
+ esd.Pattern,
+ esd.BaseDate,
+ CASE
+ WHEN DATENAME(WEEKDAY, esd.BaseDate) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = esd.BaseDate)
+ THEN dbo.fn_GetPreviousWorkday(esd.BaseDate)
+ ELSE esd.BaseDate
+ END AS AdjustedRunDate,
+ FORMAT(esd.BaseDate, 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM ExplicitScheduleDates esd;
+
+ -------------------------------------------------------------------------
+ -- 8. Handle any quarterly jobs that didn't match the patterns above
+ -------------------------------------------------------------------------
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ @FailSafeDate,
+ @FailSafeDate,
+ FORMAT(DATEFROMPARTS(@Year, 1, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND NOT EXISTS (
+ SELECT 1 FROM dbo.JobSchedule js
+ WHERE js.JobName = jp.JobName AND js.YearOfSchedule = @Year
+ );
+
+ -------------------------------------------------------------------------
+ -- 9. Cleanup and output
+ -------------------------------------------------------------------------
+ DROP TABLE #JobProcessing;
+
+ -- Update any NULL dates to fail-safe date
+ UPDATE dbo.JobSchedule
+ SET ScheduledDate = @FailSafeDate,
+ AdjustedRunDate = @FailSafeDate
+ WHERE YearOfSchedule = @Year
+ AND (ScheduledDate IS NULL OR AdjustedRunDate IS NULL);
+
+ DECLARE @RecordCount INT = (SELECT COUNT(*) FROM dbo.JobSchedule WHERE YearOfSchedule = @Year);
+
+ PRINT 'Job schedule generation completed for year ' + CAST(@Year AS VARCHAR(4)) +
+ '. Total records created: ' + CAST(@RecordCount AS VARCHAR(10));
+END;
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_ScheduleJob.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_ScheduleJob.sql
new file mode 100644
index 0000000..f6c2ffa
--- /dev/null
+++ b/SqlAgent/02_Test/3_Stored_Procedures/usp_ScheduleJob.sql
@@ -0,0 +1,160 @@
+USE [msdb]
+GO
+
+/****** Object: StoredProcedure [dbo].[usp_ScheduleJob] Script Date: 10/18/2025 9:52:04 AM ******/
+SET ANSI_NULLS ON
+GO
+
+SET QUOTED_IDENTIFIER ON
+GO
+
+
+CREATE OR ALTER PROCEDURE [dbo].[usp_ScheduleJob]
+ @JobName NVARCHAR(100),
+ @Env CHAR(4), -- 'DEVL' | 'TEST' | 'PROD'
+ @RunDate DATE,
+ @RunTime TIME
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE
+ @JobId UNIQUEIDENTIFIER,
+ @ScheduleName NVARCHAR(200),
+ @dbName NVARCHAR(128),
+ @ActiveStartDate INT,
+ @ActiveStartTime INT,
+ @Sql NVARCHAR(MAX),
+ @JobExists BIT = 0,
+ @ScheduleId INT;
+
+ -- Table variable must be declared separately and at the top level
+ DECLARE @ExistingSchedules TABLE (
+ schedule_id INT,
+ schedule_name NVARCHAR(200)
+ );
+
+ -- Map environment to actual DB name
+ SET @dbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ ELSE 'DevlDUTASJobSchedule'
+ END;
+
+ -- Validate parameters
+ IF @Env NOT IN ('DEVL','TEST','PROD')
+ BEGIN
+ RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1);
+ RETURN;
+ END
+
+ IF @RunDate < CAST(GETDATE() AS DATE)
+ BEGIN
+ RAISERROR('RunDate cannot be in the past.', 16, 1);
+ RETURN;
+ END;
+
+ -- Check if job exists in JobControl table
+ SET @Sql = N'SELECT @JobExists = 1 FROM ' + QUOTENAME(@dbName) + '.dbo.JobControl WHERE JobName = @JobNameParam';
+
+ EXEC sp_executesql @Sql,
+ N'@JobNameParam NVARCHAR(100), @JobExists BIT OUTPUT',
+ @JobNameParam = @JobName,
+ @JobExists = @JobExists OUTPUT;
+
+ IF @JobExists = 0
+ BEGIN
+ RAISERROR('Job %s not found in JobControl table.', 16, 1, @JobName);
+ RETURN;
+ END;
+
+ -- Activate job in control table
+ SET @Sql = N'UPDATE ' + QUOTENAME(@dbName) + '.dbo.JobControl SET IsActive = 1 WHERE JobName = @JobNameParam';
+ EXEC sp_executesql @Sql,
+ N'@JobNameParam NVARCHAR(100)',
+ @JobNameParam = @JobName;
+
+ PRINT 'Job activated in JobControl.';
+
+ -- Convert date/time to SQL Agent format
+ SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), @RunDate, 112));
+ SET @ActiveStartTime = DATEPART(HOUR, @RunTime) * 10000 +
+ DATEPART(MINUTE, @RunTime) * 100 +
+ DATEPART(SECOND, @RunTime);
+
+ SET @ScheduleName = @JobName + '_MonthlySchedule';
+
+ -- Get job id
+ SELECT @JobId = job_id
+ FROM msdb.dbo.sysjobs
+ WHERE name = @JobName;
+
+ IF @JobId IS NULL
+ BEGIN
+ RAISERROR('SQL Agent job "%s" not found.', 16, 1, @JobName);
+ RETURN;
+ END;
+
+ BEGIN TRY
+ BEGIN TRANSACTION;
+
+ -- Detach and delete all existing schedules for this job
+ INSERT INTO @ExistingSchedules (schedule_id, schedule_name)
+ SELECT s.schedule_id, s.name
+ FROM msdb.dbo.sysschedules AS s
+ INNER JOIN msdb.dbo.sysjobschedules AS js ON s.schedule_id = js.schedule_id
+ WHERE js.job_id = @JobId;
+
+ DECLARE @OldScheduleId INT, @OldScheduleName NVARCHAR(200);
+
+ DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
+ SELECT schedule_id, schedule_name FROM @ExistingSchedules;
+
+ OPEN cur;
+ FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ PRINT 'Detaching old schedule: ' + @OldScheduleName;
+ EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @OldScheduleName;
+
+ PRINT 'Deleting old schedule: ' + @OldScheduleName;
+ EXEC msdb.dbo.sp_delete_schedule @schedule_name = @OldScheduleName;
+
+ FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName;
+ END
+
+ CLOSE cur;
+ DEALLOCATE cur;
+
+ -- Create new one-time schedule
+ EXEC msdb.dbo.sp_add_schedule
+ @schedule_name = @ScheduleName,
+ @enabled = 1,
+ @freq_type = 1, -- One-time
+ @active_start_date = @ActiveStartDate,
+ @active_start_time = @ActiveStartTime;
+
+ -- Attach schedule to job
+ EXEC msdb.dbo.sp_attach_schedule
+ @job_id = @JobId,
+ @schedule_name = @ScheduleName;
+
+ COMMIT TRANSACTION;
+
+ PRINT 'New schedule created for job "' + @JobName +
+ '" on ' + CONVERT(VARCHAR(10), @RunDate, 120) +
+ ' at ' + CONVERT(VARCHAR(8), @RunTime, 108);
+ END TRY
+ BEGIN CATCH
+ IF @@TRANCOUNT > 0
+ ROLLBACK TRANSACTION;
+
+ DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
+ RAISERROR('Error creating schedule: %s', 16, 1, @ErrorMessage);
+ END CATCH;
+END;
+GO
+
+
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql
new file mode 100644
index 0000000..adcfa37
--- /dev/null
+++ b/SqlAgent/02_Test/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql
@@ -0,0 +1,39 @@
+USE TestDUTASJobSchedule;
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_ScheduleJobsForMonth
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE @MonthKey CHAR(7) = FORMAT(GETDATE(), 'yyyy-MM');
+ DECLARE @Year INT = YEAR(GETDATE());
+ DECLARE @JobName VARCHAR(100);
+ DECLARE @RunDate DATE;
+ DECLARE @RunTime TIME;
+ DECLARE @Env VARCHAR(10) = 'TEST'; -- configurable per environment
+
+ DECLARE job_cursor CURSOR FOR
+ SELECT js.JobName, js.AdjustedRunDate, jc.ScheduledStartTime
+ FROM dbo.JobSchedule js
+ INNER JOIN dbo.JobControl jc ON js.JobName = jc.JobName
+ WHERE js.MonthOfSchedule = @MonthKey
+ AND jc.IsActive = 1;
+
+ OPEN job_cursor;
+ FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ EXEC msdb.dbo.usp_ScheduleJob
+ @JobName = @JobName,
+ @Env = @Env,
+ @RunDate = @RunDate,
+ @RunTime = @RunTime;
+
+ FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime;
+ END
+
+ CLOSE job_cursor;
+ DEALLOCATE job_cursor;
+END
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_TriggerMissedJobs.sql
new file mode 100644
index 0000000..53496ac
Binary files /dev/null and b/SqlAgent/02_Test/3_Stored_Procedures/usp_TriggerMissedJobs.sql differ
diff --git a/SqlAgent/02_Test/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/02_Test/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql
new file mode 100644
index 0000000..6057d6e
Binary files /dev/null and b/SqlAgent/02_Test/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/ActivateOnDemandJob.sql b/SqlAgent/02_Test/4_Job_Maintenance/ActivateOnDemandJob.sql
new file mode 100644
index 0000000..8ba8703
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/ActivateOnDemandJob.sql
@@ -0,0 +1,10 @@
+USE msdb;
+GO
+
+-- Schedule TEST OnDemand Job on 03 Nov at 18:15 PM
+------------------------------------------------
+EXEC dbo.usp_ScheduleJob
+ @JobName='TEST_MONTHLY_DTSRQ414',
+ @Env='TEST',
+ @RunDate='2025-11-03',
+ @RunTime='18:15:00';
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/AddAllJobsToSQLAgent.sql b/SqlAgent/02_Test/4_Job_Maintenance/AddAllJobsToSQLAgent.sql
new file mode 100644
index 0000000..1365898
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/AddAllJobsToSQLAgent.sql
@@ -0,0 +1,141 @@
+USE [msdb]
+GO
+
+-- Execute the stored procedure for each job
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX215', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX305', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID0', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_GSIRQ300', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ202', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID1', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX202', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSFT202', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX432', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGACHD', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX303', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGWAGE', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGCHKS', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSESDAY', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGPAYT', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSDX145', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX629', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX630', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSFRAUD', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRACHD', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXACH', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXREG', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX430', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX626', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX530', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXREL', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX450', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX451', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSPACHD', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSPX148', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ325', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX427', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSPDAY1', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSW4WGE', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID2', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSGSID9', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSMIN01', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSMIN02', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ459', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBXPFL', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DESBD427', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX403', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBE405', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX405', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSRQ335', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_DAILY_DTSBX601', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSGSID0', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSGSID1', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBX202', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSFT202', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBX470', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBXREJ', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSPDAY7', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSBX122', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSRQ511', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSRQ444', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_WEEKLY_DTSRQ126', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSRQ414', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSPMON1', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSCHGVB', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSCHGVR', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSVBKUP', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSVRSTR', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSRQ442', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSBX460', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSRQ513', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_MONTHLY_DTSCHGDC', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ119', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ902', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSBX500', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ417', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ320', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ713', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSBX468', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHGQ1', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHGQ2', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ327', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ328', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ412', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ793', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSWGE06', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHGRT', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSCHRGS', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ540', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRQ591', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSRTCHG', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DTSWGE01', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_QUARTERLY_DESBD426', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSACH01', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSBX415', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSBX452', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSBX453', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ120', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ123', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ125', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ305', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ306', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ308', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ311', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ410', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ411', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ423', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ426', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ429', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ439', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ602', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ606', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ607', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ609', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ611', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ612', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ717', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ718', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ720', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRQ721', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT715', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT716', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT717', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT718', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT719', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT720', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT722', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_ONDEMAND_DTSRT723', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ722', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ451', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ127', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ321', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ455', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ500', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ517', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ518', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ616', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ701', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ702', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ704', @Env = 'TEST';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'TEST_YEARLY_DTSRQ910', @Env = 'TEST';
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/AddDailyJobSchedule.sql b/SqlAgent/02_Test/4_Job_Maintenance/AddDailyJobSchedule.sql
new file mode 100644
index 0000000..88d2d22
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/AddDailyJobSchedule.sql
@@ -0,0 +1 @@
+EXEC msdb.dbo.usp_CreateDailyJobSchedule @Env = 'TEST';
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/AddNewJobToSQLAgent.sql b/SqlAgent/02_Test/4_Job_Maintenance/AddNewJobToSQLAgent.sql
new file mode 100644
index 0000000..743765a
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/AddNewJobToSQLAgent.sql
@@ -0,0 +1,5 @@
+USE [msdb]
+GO
+
+-- Create a job in SQL Agent (With Standard 3 steps approach)
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'DEVL_DAILY_DTSBX215', @Env = 'DEVL';
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/AddWeeklyJobSchedule.sql b/SqlAgent/02_Test/4_Job_Maintenance/AddWeeklyJobSchedule.sql
new file mode 100644
index 0000000..39978c4
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/AddWeeklyJobSchedule.sql
@@ -0,0 +1 @@
+EXEC msdb.dbo.usp_CreateWeeklySchedules @Env = 'TEST';
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/02_Test/4_Job_Maintenance/DailyJobScheduleLookup.sql
new file mode 100644
index 0000000..b893457
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/DailyJobScheduleLookup.sql
@@ -0,0 +1,86 @@
+/********************************************************************************************
+ Section 1: Daily Job Schedule Lookup
+ --------------------------------------------------------------------------------------------
+ Description:
+ Returns all SQL Agent jobs scheduled to run on a given date, along with their control
+ status (IsActive) and configured runtime from JobControl.
+
+ Parameters:
+ @CheckDate - The date to check job schedules for.
+
+ Notes:
+ • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules).
+ • Supports One-time, Daily, Weekly, and Monthly schedule types.
+ • Can easily be adapted for DEVL / TEST / PROD by changing @DbName.
+
+********************************************************************************************/
+USE msdb;
+GO
+
+DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed
+DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate);
+DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD
+DECLARE @DbName SYSNAME;
+
+-- Map environment to the right control DB
+SET @DbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ END;
+
+DECLARE @Sql NVARCHAR(MAX);
+SET @Sql = N'
+SELECT
+ j.name AS SQLAgentJobName,
+ jc.JobName AS ControlJobName,
+ jc.ScheduledStartTime,
+ jc.IsActive,
+ s.name AS ScheduleName,
+ s.freq_type,
+ s.freq_interval,
+ s.freq_subday_type,
+ s.freq_subday_interval,
+ s.active_start_date,
+ CASE s.freq_type
+ WHEN 1 THEN ''One-time''
+ WHEN 4 THEN ''Daily''
+ WHEN 8 THEN ''Weekly''
+ WHEN 16 THEN ''Monthly''
+ ELSE ''Other''
+ END AS FrequencyType,
+ CASE
+ WHEN s.freq_type = 1
+ AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))
+ THEN 1
+ WHEN s.freq_type = 4
+ AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))
+ THEN 1
+ WHEN s.freq_type = 8 -- Weekly
+ AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0
+ THEN 1
+ WHEN s.freq_type = 16 -- Monthly
+ AND DAY(@CheckDateParam) = s.freq_interval
+ THEN 1
+ ELSE 0
+ END AS IsScheduledToday
+FROM msdb.dbo.sysjobs j
+JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id
+JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id
+LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name
+WHERE jc.IsActive = 1
+ AND (
+ (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time
+ OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily
+ OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly
+ OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly
+ )
+ORDER BY jc.ScheduledStartTime;
+';
+
+EXEC sp_executesql
+ @Sql,
+ N'@CheckDateParam DATE, @CheckWeekdayParam INT',
+ @CheckDateParam = @CheckDate,
+ @CheckWeekdayParam = @CheckWeekday;
+GO
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/DeactivateJob.sql b/SqlAgent/02_Test/4_Job_Maintenance/DeactivateJob.sql
new file mode 100644
index 0000000..e72bae5
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/DeactivateJob.sql
@@ -0,0 +1,12 @@
+USE TestDUTASJobSchedule;
+GO
+
+UPDATE dbo.JobControl
+SET IsActive = 0
+WHERE Frequency = 'MONTHLY';
+GO
+
+-- Optional: Verify changes
+SELECT JobName, Frequency, IsActive
+FROM dbo.JobControl
+WHERE Frequency = 'MONTHLY';
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/DeleteSchedule.sql b/SqlAgent/02_Test/4_Job_Maintenance/DeleteSchedule.sql
new file mode 100644
index 0000000..04be04d
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/DeleteSchedule.sql
@@ -0,0 +1,27 @@
+USE msdb;
+GO
+
+DECLARE @EnvPrefix NVARCHAR(50) = N'TEST'; -- <<< Change this to your environment prefix
+DECLARE @schedule_id INT;
+DECLARE @schedule_name NVARCHAR(128);
+
+DECLARE Sched_Cursor CURSOR FOR
+SELECT schedule_id, name
+FROM msdb.dbo.sysschedules
+WHERE name LIKE @EnvPrefix + '%'; -- Only schedules starting with the given prefix
+
+OPEN Sched_Cursor;
+FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name;
+
+WHILE @@FETCH_STATUS = 0
+BEGIN
+ PRINT 'Deleting schedule: ' + @schedule_name;
+ EXEC msdb.dbo.sp_delete_schedule @schedule_id = @schedule_id;
+ FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name;
+END
+
+CLOSE Sched_Cursor;
+DEALLOCATE Sched_Cursor;
+
+PRINT 'All SQL Agent schedules starting with prefix ' + @EnvPrefix + ' deleted successfully.';
+GO
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/02_Test/4_Job_Maintenance/DetachDeleteScheduleByName.sql
new file mode 100644
index 0000000..d646072
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/DetachDeleteScheduleByName.sql
@@ -0,0 +1,13 @@
+-- If you know both the job name and schedule name
+DECLARE @JobName NVARCHAR(100) = 'TEST_MONTHLY_DTSCHGDC';
+DECLARE @ScheduleName NVARCHAR(200) = 'TEST_MONTHLY_DTSCHGDC_MonthlySchedule';
+DECLARE @JobId UNIQUEIDENTIFIER;
+
+-- Get job ID
+SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName;
+
+-- Detach from specific job
+EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName;
+
+-- Then delete
+EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName;
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/FederalHolidaysDML.sql b/SqlAgent/02_Test/4_Job_Maintenance/FederalHolidaysDML.sql
new file mode 100644
index 0000000..9564b7e
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/FederalHolidaysDML.sql
@@ -0,0 +1,63 @@
+USE [TestDUTASJobSchedule];
+GO
+
+/**************************************************************************************************
+-- FILE: FederalHolidays.sql
+-- PURPOSE: Manage FederalHolidays table - Create, Read, Update, Delete for a single holiday
+-- TABLE: dbo.FederalHolidays
+**************************************************************************************************/
+
+-------------------------------
+-- SELECT - View Holiday
+-------------------------------
+SELECT *
+FROM [dbo].[FederalHolidays]
+WHERE [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day';
+GO
+
+-------------------------------
+-- INSERT - Create Holiday
+-------------------------------
+INSERT INTO [dbo].[FederalHolidays]
+(
+ [HolidayDate],
+ [HolidayName],
+ [Year]
+)
+VALUES
+(
+ '2025-01-01', -- Holiday date
+ N'New Year''s Day', -- Holiday name
+ 2025 -- Year
+);
+GO
+
+-------------------------------
+-- UPDATE - Modify Holiday
+-------------------------------
+UPDATE [dbo].[FederalHolidays]
+SET
+ [HolidayName] = N'New Year''s Day (Observed)',
+ [HolidayDate] = '2025-01-02'
+WHERE
+ [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day';
+GO
+
+-------------------------------
+-- DELETE - Remove Holiday
+-------------------------------
+DELETE FROM [dbo].[FederalHolidays]
+WHERE [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day (Observed)';
+GO
+
+-------------------------------
+-- SELECT - View Holiday
+-------------------------------
+SELECT *
+FROM [dbo].[FederalHolidays]
+WHERE [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day';
+GO
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/02_Test/4_Job_Maintenance/ForceCompleteJob.sql
new file mode 100644
index 0000000..b34da74
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/ForceCompleteJob.sql
@@ -0,0 +1,16 @@
+USE TestDUTASJobSchedule;
+GO
+
+-- 1. Check today's job status
+SELECT JobName, Status, ErrorMessage
+FROM dbo.JobExecutionHistory
+WHERE RunDate = CAST(GETDATE() AS DATE)
+AND JobName = 'TEST_WEEKLY_DTSGSID1';
+
+-- 2. Mark DTSBX305 as manually overridden
+EXEC dbo.usp_ForceComplete 'TEST_WEEKLY_DTSGSID1', 'Neeraj.Kumar';
+
+-- 3. Verify the override
+SELECT JobName, Status, OverrideBy, OverrideDate
+FROM dbo.JobExecutionHistory
+WHERE JobName = 'TEST_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE);
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/GenerateJobScheduleTable.sql b/SqlAgent/02_Test/4_Job_Maintenance/GenerateJobScheduleTable.sql
new file mode 100644
index 0000000..7c58121
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/GenerateJobScheduleTable.sql
@@ -0,0 +1,10 @@
+USE TestDUTASJobSchedule;
+GO
+
+-- Set Job Schedule for the Year 2025
+EXEC dbo.usp_GenerateJobSchedule @Year = 2025;
+GO
+
+-- Set Job Schedule for the Year 2026
+EXEC dbo.usp_GenerateJobSchedule @Year = 2026;
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/JobControlDML.sql b/SqlAgent/02_Test/4_Job_Maintenance/JobControlDML.sql
new file mode 100644
index 0000000..43125a5
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/JobControlDML.sql
@@ -0,0 +1,68 @@
+USE [TestDUTASJobSchedule];
+GO
+
+/**************************************************************************************************
+-- FILE: JobControl.sql
+-- PURPOSE: Manage JobControl table - Create, Read, Update, Delete for a single job
+-- TABLE: dbo.JobControl
+**************************************************************************************************/
+
+-------------------------------
+-- SELECT - View Job Record
+-------------------------------
+SELECT *
+FROM [dbo].[JobControl]
+WHERE [JobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- INSERT - Create Job Record
+-------------------------------
+INSERT INTO [dbo].[JobControl]
+(
+ [JobName],
+ [ScheduledStartTime],
+ [SchedulerAction],
+ [IsActive],
+ [CreatedDate],
+ [Frequency],
+ [FrequencyPattern]
+)
+VALUES
+(
+ N'PROD_DAILY_DTSBX215', -- Job name
+ '14:00:00', -- 2 PM (24-hour format)
+ N'CONTINUE', -- Action
+ 1, -- Active
+ GETDATE(), -- Current system time
+ N'DAILY', -- Frequency
+ N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}' -- JSON pattern
+);
+GO
+
+-------------------------------
+-- UPDATE - Modify Job Record
+-------------------------------
+UPDATE [dbo].[JobControl]
+SET
+ [ScheduledStartTime] = '15:00:00', -- Change to 3 PM
+ [SchedulerAction] = 'STOP', -- Change to STOP
+ [IsActive] = 0 -- Deactivate
+WHERE
+ [JobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- DELETE - Remove Job Record
+-------------------------------
+DELETE FROM [dbo].[JobControl]
+WHERE [JobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- SELECT - View Job Record
+-------------------------------
+SELECT *
+FROM [dbo].[JobControl]
+WHERE [JobName] = N'PROD_DAILY_DTSBX215';
+GO
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/JobDependenciesDML.sql b/SqlAgent/02_Test/4_Job_Maintenance/JobDependenciesDML.sql
new file mode 100644
index 0000000..97bdcee
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/JobDependenciesDML.sql
@@ -0,0 +1,56 @@
+USE [TestDUTASJobSchedule];
+GO
+
+/**************************************************************************************************
+-- FILE: JobDependencies.sql
+-- PURPOSE: Manage JobDependencies table - Create, Read, Update, Delete for a single dependency
+-- TABLE: dbo.JobDependencies
+**************************************************************************************************/
+
+-------------------------------
+-- SELECT - View Dependency
+-------------------------------
+SELECT *
+FROM [dbo].[JobDependencies]
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0';
+GO
+
+-------------------------------
+-- INSERT - Create Dependency
+-------------------------------
+INSERT INTO [dbo].[JobDependencies]
+(
+ [JobName],
+ [PredecessorJobName]
+)
+VALUES
+(
+ N'PROD_DAILY_DTSGSID0', -- Dependent job
+ N'PROD_DAILY_DTSBX305' -- Predecessor job
+);
+GO
+
+-------------------------------
+-- UPDATE - Modify Dependency
+-------------------------------
+UPDATE [dbo].[JobDependencies]
+SET [PredecessorJobName] = N'PROD_DAILY_DTSBX215'
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0'
+ AND [PredecessorJobName] = N'PROD_DAILY_DTSBX305';
+GO
+
+-------------------------------
+-- DELETE - Remove Dependency
+-------------------------------
+DELETE FROM [dbo].[JobDependencies]
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0'
+ AND [PredecessorJobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- SELECT - View Dependency
+-------------------------------
+SELECT *
+FROM [dbo].[JobDependencies]
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0';
+GO
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/JobInfo.sql b/SqlAgent/02_Test/4_Job_Maintenance/JobInfo.sql
new file mode 100644
index 0000000..4cd23e4
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/JobInfo.sql
@@ -0,0 +1,47 @@
+USE msdb;
+GO
+
+PRINT '================================================================================';
+PRINT 'SECTION 1: JOB CONTROL INFORMATION';
+PRINT '================================================================================';
+GO
+
+-- View all active jobs
+SELECT JobName, ScheduledStartTime, Frequency, IsActive
+FROM TestDUTASJobSchedule.dbo.JobControl
+WHERE IsActive = 1
+ORDER BY Frequency, ScheduledStartTime;
+GO
+
+-- View all inactive jobs
+SELECT JobName, Frequency, ScheduledStartTime
+FROM TestDUTASJobSchedule.dbo.JobControl
+WHERE IsActive = 0
+ORDER BY Frequency;
+GO
+
+-- Find weekly/monthly jobs
+SELECT JobName, Frequency, ScheduledStartTime
+FROM TestDUTASJobSchedule.dbo.JobControl
+WHERE Frequency IN ('WEEKLY', 'MONTHLY')
+ORDER BY Frequency, ScheduledStartTime;
+GO
+
+PRINT '================================================================================';
+PRINT 'SECTION 2: JOB DEPENDENCIES';
+PRINT '================================================================================';
+GO
+
+-- Check dependencies for a job
+DECLARE @Job NVARCHAR(100) = 'TEST_MONTHLY_DTSCHGVR';
+SELECT JobName, PredecessorJobName
+FROM TestDUTASJobSchedule.dbo.JobDependencies
+WHERE JobName = @Job;
+GO
+
+-- Show dependency chain overview
+SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency
+FROM TestDUTASJobSchedule.dbo.JobDependencies d
+JOIN TestDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName
+ORDER BY jc.Frequency, jc.ScheduledStartTime;
+GO
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/02_Test/4_Job_Maintenance/SQLAgentInfo.sql
new file mode 100644
index 0000000..d63458e
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/SQLAgentInfo.sql
@@ -0,0 +1,42 @@
+USE msdb;
+GO
+
+PRINT '================================================================================';
+PRINT 'SECTION 1: SQL AGENT JOB STATUS';
+PRINT '================================================================================';
+GO
+
+-- List all jobs in SQL Agent
+SELECT name AS JobName, enabled, date_created, date_modified
+FROM msdb.dbo.sysjobs
+ORDER BY name;
+GO
+
+-- Job schedule summary
+SELECT j.name AS JobName, s.name AS ScheduleName,
+ s.enabled, s.freq_type, s.active_start_date, s.active_start_time
+FROM msdb.dbo.sysjobs j
+JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id
+JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id
+ORDER BY j.name;
+GO
+
+-- Last job run details
+SELECT j.name AS JobName,
+ h.run_status,
+ CASE h.run_status
+ WHEN 0 THEN 'Failed'
+ WHEN 1 THEN 'Succeeded'
+ WHEN 2 THEN 'Retry'
+ WHEN 3 THEN 'Canceled'
+ WHEN 4 THEN 'In Progress'
+ END AS StatusDescription,
+ msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime,
+ h.run_duration
+FROM dbo.sysjobs j
+LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id
+WHERE h.instance_id IN (
+ SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id
+)
+ORDER BY RunDateTime DESC;
+GO
\ No newline at end of file
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/ScheduleJobsMonthly.sql b/SqlAgent/02_Test/4_Job_Maintenance/ScheduleJobsMonthly.sql
new file mode 100644
index 0000000..cd590b3
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/ScheduleJobsMonthly.sql
@@ -0,0 +1,3 @@
+USE TestDUTASJobSchedule;
+GO
+EXEC dbo.usp_ScheduleJobsForMonth;
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/TodaysExecution.sql b/SqlAgent/02_Test/4_Job_Maintenance/TodaysExecution.sql
new file mode 100644
index 0000000..7509ac0
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/TodaysExecution.sql
@@ -0,0 +1,21 @@
+USE TestDUTASJobSchedule;
+GO
+
+DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday
+
+SELECT
+ jeh.ExecutionID,
+ jeh.JobName,
+ jeh.RunDate,
+ jc.ScheduledStartTime,
+ jeh.ActualStartTime,
+ jeh.ActualEndTime,
+ jeh.Status,
+ jeh.ErrorMessage,
+ jeh.OverrideFlag,
+ jeh.OverrideBy
+FROM dbo.JobExecutionHistory jeh
+INNER JOIN dbo.JobControl jc
+ ON jeh.JobName = jc.JobName
+WHERE jeh.RunDate = @Runday
+ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime;
diff --git a/SqlAgent/02_Test/4_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/02_Test/4_Job_Maintenance/TriggerMissedJob.sql
new file mode 100644
index 0000000..5899713
--- /dev/null
+++ b/SqlAgent/02_Test/4_Job_Maintenance/TriggerMissedJob.sql
@@ -0,0 +1,9 @@
+USE [TestDUTASJobSchedule]
+GO
+
+-- 1. Preview missed jobs (safe, no run):
+ EXEC dbo.usp_TriggerMissedJobs @DryRun = 1;
+
+-- 2. Actually trigger missed jobs:
+ EXEC dbo.usp_TriggerMissedJobs @DryRun = 0;
+
diff --git a/SqlAgent/02_Test/5_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/02_Test/5_PowerShell_Scripts/Execute-RemoteJob.ps1
new file mode 100644
index 0000000..742e8b3
--- /dev/null
+++ b/SqlAgent/02_Test/5_PowerShell_Scripts/Execute-RemoteJob.ps1
@@ -0,0 +1,118 @@
+param(
+[Parameter(Mandatory = $true)]
+[string]$JobName,
+
+```
+[Parameter(Mandatory = $true)]
+[ValidateSet('DEVL', 'TEST', 'PROD')]
+[string]$Env
+```
+
+)
+
+try {
+Write-Host "Starting job $JobName in environment $Env at $(Get-Date)"
+
+```
+# ------------------------------------------------------------
+# Extract JCL from JobName (ENV_FREQUENCY_JOB pattern)
+# ------------------------------------------------------------
+$JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', ''
+Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow
+
+# ------------------------------------------------------------
+# Environment-specific configuration
+# ------------------------------------------------------------
+switch ($Env.ToUpper()) {
+ 'DEVL' {
+ $ComputerName = '10.57.110.120'
+ $DatabaseName = 'DevlDUTASJobSchedule'
+ $SqlServer = 'DOES_DUTAS-SQL1'
+ }
+ 'TEST' {
+ $ComputerName = '10.57.110.141'
+ $DatabaseName = 'TestDUTASJobSchedule'
+ $SqlServer = 'DOES_DUTAS-SQL1'
+ }
+ 'PROD' {
+ $ComputerName = '10.57.111.120'
+ $DatabaseName = 'ProdDUTASJobSchedule'
+ $SqlServer = 'DOES_DUTAS-SQL'
+ }
+ default {
+ throw "Invalid environment specified: $Env"
+ }
+}
+
+# ------------------------------------------------------------
+# Remote credentials (consider secure vault in production)
+# ------------------------------------------------------------
+$username = "DUTASSQLAdminP@does.dcgov.priv"
+$password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force
+$credential = New-Object System.Management.Automation.PSCredential($username, $password)
+
+# ------------------------------------------------------------
+# Execute job remotely using the extracted JCL
+# ------------------------------------------------------------
+Write-Host "Connecting to remote server $ComputerName ..."
+$exitCode = Invoke-Command -ComputerName $ComputerName `
+ -Credential $credential `
+ -Authentication CredSSP `
+ -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) `
+ -ArgumentList $JobName, $JCL, $Env `
+ -ScriptBlock {
+ param($JobName, $JCL, $Env)
+ Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env"
+
+ $process = Start-Process -FilePath "powershell.exe" `
+ -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" `
+ -NoNewWindow -Wait -PassThru
+ return $process.ExitCode
+ }
+
+if (-not $exitCode) { $exitCode = 1 } # Guard for null/false exit codes
+
+if ($exitCode -eq 0) {
+ Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green
+} else {
+ Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode"
+}
+```
+
+}
+catch {
+Write-Error "Job $JobName failed with error: $($_.Exception.Message)"
+$exitCode = 1
+}
+finally {
+# ------------------------------------------------------------
+# Log exit code to the appropriate database
+# ------------------------------------------------------------
+try {
+$connectionString = "Server=$SqlServer;Database=$DatabaseName;Trusted_Connection=true;"
+$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
+$connection.Open()
+
+```
+ $command = $connection.CreateCommand()
+ $command.CommandText = @"
+ INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime)
+ VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE());
+```
+
+"@
+$command.ExecuteNonQuery()
+$connection.Close()
+
+```
+ Write-Host "Exit code $exitCode logged to database $DatabaseName on $SqlServer for job $JobName"
+}
+catch {
+ $errorMsg = $_.Exception.Message
+ Write-Host "Failed to log exit code to database $DatabaseName on $SqlServer`: $errorMsg"
+}
+```
+
+}
+
+exit $exitCode
diff --git a/SqlAgent/02_Test/5_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/02_Test/5_PowerShell_Scripts/RCSubmit-Job.ps1
new file mode 100644
index 0000000..e603fc4
--- /dev/null
+++ b/SqlAgent/02_Test/5_PowerShell_Scripts/RCSubmit-Job.ps1
@@ -0,0 +1,140 @@
+param(
+ [string]$JobName,
+ [string]$Env
+)
+
+# --- Parameter Validation ---
+if (-not $JobName) {
+ Write-Host "JobName parameter is required" -ForegroundColor Red
+ exit 1
+}
+if (-not $Env) {
+ Write-Host "Environment (Env) parameter is required" -ForegroundColor Red
+ exit 1
+}
+
+# --- Execute Job ---
+Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan
+$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)"
+$exitCode = [int]$LASTEXITCODE
+$isSuccess = 0
+
+# --- Parse SYSLOG Path ---
+$syslogPath = $null
+$syslogFolder = "Not found"
+$content = @()
+$summary = @()
+
+try {
+ $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value }
+
+ if ($syslogPath -and (Test-Path $syslogPath)) {
+ $syslogFolder = Split-Path $syslogPath -Parent
+ $content = Get-Content $syslogPath -ErrorAction Stop
+ $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object {
+ $_.Context.PostContext | Select-Object -Skip 1 -First 5
+ }
+ } else {
+ Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow
+ $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n")
+ }
+}
+catch {
+ Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow
+ $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n")
+}
+
+# --- Evaluate Return Codes ---
+$successConditions = @(
+ { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 },
+ { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 },
+ { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 },
+ { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 },
+ { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 },
+ { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 },
+ { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 },
+ { $JobName -eq "DTSBE405" -and $exitCode -eq 910 },
+ { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 },
+ { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 },
+ { $exitCode -eq 0 }
+)
+
+if ($successConditions | Where-Object { & $_ }) {
+ Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green
+ $isSuccess = 0
+} else {
+ Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red
+ $isSuccess = 1
+ if ($summary.Count -eq 0) {
+ $summary = @($Error[0])
+ }
+}
+
+# --- Email Notification Settings ---
+$smtpServer = "smtp4.dc.gov"
+$fromEmail = "Dutas@dc.gov"
+$toEmail = "zarath.lalputan@dc.gov"
+$ccEmail = @("srujani.chandragiri@dc.gov", "neerajk@innovaconsulting.com")
+
+$emailBody = @"
+
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code : $exitCode
+Status : $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path : $syslogFolder
+
+"@
+
+# --- Attachment Setup ---
+# Automatically attach MSGLOG.txt if it exists in the JOBLOG folder
+$attachmentPath = Join-Path $syslogFolder "MSGLOG.txt"
+
+$sendParams = @{
+ SmtpServer = $smtpServer
+ Port = 25
+ From = $fromEmail
+ To = $toEmail
+ Cc = $ccEmail
+ Subject = "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })"
+ Body = $emailBody
+ BodyAsHtml = $true
+}
+
+if (Test-Path $attachmentPath) {
+ $sendParams['Attachments'] = $attachmentPath
+ Write-Host "Attachment found: $attachmentPath" -ForegroundColor Cyan
+} else {
+ Write-Host "No MSGLOG.txt found at $syslogFolder" -ForegroundColor Yellow
+}
+
+# --- Conditional Email Sending ---
+# ===================================================================================
+# EMAIL SEND CONDITION TOGGLE:
+# By default, email will ALWAYS be sent whether the job succeeded or failed.
+# To send email ONLY if the job fails, uncomment the next line:
+# if ($isSuccess -eq 1) {
+# ===================================================================================
+
+try {
+ Write-Host "Preparing to send email to $toEmail..." -ForegroundColor Yellow
+ Send-MailMessage @sendParams
+ Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan
+}
+catch {
+ Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow
+}
+
+# ===================================================================================
+# End of email send condition block (only required if you uncomment the IF above)
+# } # End Email send condition
+# ===================================================================================
+
+Write-Host "`n---------------------------------------------"
+Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })"
+Write-Host "---------------------------------------------`n"
+
+exit $isSuccess
diff --git a/SqlAgent/02_Test/6_Backup_Restore/Backup-Restore-Guide.docx b/SqlAgent/02_Test/6_Backup_Restore/Backup-Restore-Guide.docx
new file mode 100644
index 0000000..c19787a
Binary files /dev/null and b/SqlAgent/02_Test/6_Backup_Restore/Backup-Restore-Guide.docx differ
diff --git a/SqlAgent/02_Test/6_Backup_Restore/Backup-SQLAgent.ps1 b/SqlAgent/02_Test/6_Backup_Restore/Backup-SQLAgent.ps1
new file mode 100644
index 0000000..e74cf14
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/Backup-SQLAgent.ps1
@@ -0,0 +1,48 @@
+# ===================================================================
+# SQL Agent Jobs Backup Script (PowerShell)
+# Modern Version using SqlServer module
+# & "E:\Neeraj\SqlAgent\v2\01_Test\6_Backup\Backup-SQLAgent.ps1" `
+# -ServerName "DOES-DUTAS-SQL1" `
+# -BackupPath "\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\"
+#
+# ===================================================================
+
+param (
+ [Parameter(Mandatory = $true)]
+ [string]$ServerName,
+
+ [Parameter(Mandatory = $true)]
+ [string]$BackupPath
+)
+
+# Load SQL Server PowerShell module
+Import-Module SqlServer -ErrorAction Stop
+
+# Create timestamp and output paths
+$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
+$ZipFile = Join-Path $BackupPath "SQLAgentJobs_$Timestamp.zip"
+
+# Ensure backup folder exists
+if (-not (Test-Path $BackupPath)) {
+ New-Item -ItemType Directory -Path $BackupPath | Out-Null
+}
+
+# Connect to SQL Server
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
+
+# Export all jobs as individual SQL scripts
+$JobFiles = @()
+foreach ($job in $server.JobServer.Jobs) {
+ $SafeJobName = ($job.Name -replace '[\\/:*?"<>|]', '_')
+ $FileName = Join-Path $BackupPath "$SafeJobName`_$Timestamp.sql"
+ $job.Script() | Out-File -FilePath $FileName -Encoding UTF8
+ $JobFiles += $FileName
+}
+
+# Compress all SQL files into a single ZIP
+Compress-Archive -Path $JobFiles -DestinationPath $ZipFile -Force
+
+# Optional: clean up individual .sql files
+# Remove-Item -Path $JobFiles
+
+Write-Host "SQL Agent jobs backup complete: $ZipFile" -ForegroundColor Green
diff --git a/SqlAgent/02_Test/6_Backup_Restore/BackupDB.sql b/SqlAgent/02_Test/6_Backup_Restore/BackupDB.sql
new file mode 100644
index 0000000..0177bca
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/BackupDB.sql
@@ -0,0 +1,19 @@
+USE master;
+GO
+
+DECLARE @SrcDB NVARCHAR(128) = 'TestDUTASJobSchedule';
+DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak';
+DECLARE @SQL NVARCHAR(MAX);
+
+-- Dynamic SQL for backup
+SET @SQL = '
+BACKUP DATABASE [' + @SrcDB + ']
+TO DISK = N''' + @BackupPath + '''
+WITH INIT, COMPRESSION, STATS = 10;
+';
+
+-- Execute backup
+EXEC(@SQL);
+
+PRINT 'Backup completed: ' + @BackupPath;
+GO
diff --git a/SqlAgent/02_Test/6_Backup_Restore/Cleanup-SQLAgent.ps1 b/SqlAgent/02_Test/6_Backup_Restore/Cleanup-SQLAgent.ps1
new file mode 100644
index 0000000..edcb054
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/Cleanup-SQLAgent.ps1
@@ -0,0 +1,45 @@
+<#
+.SYNOPSIS
+Deletes SQL Agent jobs whose names start with a given environment prefix (e.g., DEVL, TEST, PROD).
+
+.PARAMETER ServerName
+SQL Server instance name (use FCI virtual name if clustered).
+
+.PARAMETER Env
+Environment prefix for job deletion (e.g., DEVL, TEST, PROD).
+
+.EXAMPLE
+.\Cleanup-SQLAgent.ps1 -ServerName "DOES-DUTAS-SQL1" -Env "DEVL"
+#>
+
+param (
+ [Parameter(Mandatory = $true)]
+ [string]$ServerName,
+
+ [Parameter(Mandatory = $true)]
+ [string]$Environment
+)
+
+# Load SQL Server module
+Import-Module SqlServer -ErrorAction Stop
+
+# Connect to SQL Server
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
+
+# Create log file path (same folder as script)
+$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$LogPath = Join-Path $ScriptRoot "CleanupSQLAgent_$($Environment)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
+
+"=== SQL Agent Cleanup Started for $Environment : $(Get-Date) ===" | Out-File $LogPath -Encoding UTF8
+
+# Take a snapshot of all jobs first (avoids collection modification issue)
+$jobsToDelete = @($server.JobServer.Jobs | Where-Object { $_.Name -like "$Environment*" })
+
+foreach ($job in $jobsToDelete) {
+ Write-Host "Deleting job: $($job.Name)" -ForegroundColor Yellow
+ "Deleting job: $($job.Name)" | Out-File $LogPath -Append -Encoding UTF8
+ $job.Drop()
+}
+
+"=== Cleanup Complete for $Environment : $(Get-Date) ===" | Out-File $LogPath -Append -Encoding UTF8
+Write-Host "All $Environment SQL Agent jobs deleted successfully." -ForegroundColor Green
diff --git a/SqlAgent/02_Test/6_Backup_Restore/CleanupSQLAgent.sql b/SqlAgent/02_Test/6_Backup_Restore/CleanupSQLAgent.sql
new file mode 100644
index 0000000..43ff71d
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/CleanupSQLAgent.sql
@@ -0,0 +1,27 @@
+USE msdb;
+GO
+
+DECLARE @EnvPrefix NVARCHAR(50) = N'DEVL'; -- <<< Change this to your environment prefix
+DECLARE @job_id UNIQUEIDENTIFIER;
+DECLARE @job_name NVARCHAR(200);
+
+DECLARE JobCursor CURSOR FOR
+SELECT job_id, name
+FROM msdb.dbo.sysjobs
+WHERE name LIKE @EnvPrefix + '%'; -- Only jobs starting with the given prefix
+
+OPEN JobCursor;
+FETCH NEXT FROM JobCursor INTO @job_id, @job_name;
+
+WHILE @@FETCH_STATUS = 0
+BEGIN
+ PRINT 'Deleting job: ' + @job_name;
+ EXEC msdb.dbo.sp_delete_job @job_id = @job_id;
+ FETCH NEXT FROM JobCursor INTO @job_id, @job_name;
+END
+
+CLOSE JobCursor;
+DEALLOCATE JobCursor;
+
+PRINT 'All SQL Agent jobs starting with prefix ' + @EnvPrefix + ' deleted successfully.';
+GO
diff --git a/SqlAgent/02_Test/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 b/SqlAgent/02_Test/6_Backup_Restore/Extract_Backup-SQLAgent.ps1
new file mode 100644
index 0000000..760d123
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/Extract_Backup-SQLAgent.ps1
@@ -0,0 +1,8 @@
+$BackupZip = "\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\SQLAgentJobs_20251018_153000.zip"
+$ExtractPath = "\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Restore\"
+
+# Create folder if not exist
+if (-not (Test-Path $ExtractPath)) { New-Item -ItemType Directory -Path $ExtractPath | Out-Null }
+
+# Extract the ZIP
+Expand-Archive -Path $BackupZip -DestinationPath $ExtractPath -Force
diff --git a/SqlAgent/02_Test/6_Backup_Restore/RestoreDB.sql b/SqlAgent/02_Test/6_Backup_Restore/RestoreDB.sql
new file mode 100644
index 0000000..d0ae5f7
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/RestoreDB.sql
@@ -0,0 +1,31 @@
+USE master;
+GO
+
+DECLARE @SrcDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- original database
+DECLARE @NewDB NVARCHAR(128) = 'DevlDUTASJobSchedule'; -- database name to restore as
+DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-TST\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak';
+DECLARE @SQL NVARCHAR(MAX);
+
+-- Optional: check logical file names inside backup
+-- RESTORE FILELISTONLY FROM DISK = @BackupPath;
+
+-- Dynamic SQL for restore
+SET @SQL = '
+-- Optional: disconnect active connections
+ALTER DATABASE [' + @NewDB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+
+RESTORE DATABASE [' + @NewDB + ']
+FROM DISK = N''' + @BackupPath + '''
+WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-TST\E$\SQLData\' + @NewDB + '.mdf'',
+ MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-TST\E$\SQLLogs\' + @NewDB + '_log.ldf'',
+ REPLACE, STATS = 10;
+
+-- Set database back to multi-user
+ALTER DATABASE [' + @NewDB + '] SET MULTI_USER;
+';
+
+-- Execute restore
+EXEC(@SQL);
+
+PRINT 'Database restored successfully as ' + @NewDB;
+GO
diff --git a/SqlAgent/02_Test/6_Backup_Restore/RestoreSQLAgent.sql b/SqlAgent/02_Test/6_Backup_Restore/RestoreSQLAgent.sql
new file mode 100644
index 0000000..697baeb
--- /dev/null
+++ b/SqlAgent/02_Test/6_Backup_Restore/RestoreSQLAgent.sql
@@ -0,0 +1,12 @@
+# Connect to SQL Server
+$ServerName = "DOES-DUTAS-SQL1"
+$SqlInstance = "localhost" # or server instance name
+
+# Execute each script
+$ScriptFiles = Get-ChildItem -Path $ExtractPath -Filter *.sql
+foreach ($file in $ScriptFiles) {
+ Write-Host "Restoring job from: $($file.FullName)"
+ sqlcmd -S $SqlInstance -i $file.FullName
+}
+
+Write-Host "All SQL Agent jobs restored successfully."
diff --git a/SqlAgent/03_Prod/1_Database_Setup/CreateDB.sql b/SqlAgent/03_Prod/1_Database_Setup/CreateDB.sql
new file mode 100644
index 0000000..ba6a525
--- /dev/null
+++ b/SqlAgent/03_Prod/1_Database_Setup/CreateDB.sql
@@ -0,0 +1,83 @@
+-- Create the database
+CREATE DATABASE ProdDUTASJobSchedule;
+GO
+
+USE ProdDUTASJobSchedule;
+GO
+
+-- Create the main control table
+CREATE TABLE dbo.JobControl
+(
+ JobID INT IDENTITY(1,1) NOT NULL,
+ JobName VARCHAR(50) NOT NULL,
+ ScheduledStartTime TIME(7) NOT NULL,
+ SchedulerAction VARCHAR(10) NOT NULL, -- STOP or CONTINUE
+ IsActive BIT NOT NULL CONSTRAINT DF_JobControl_IsActive DEFAULT (1),
+ CreatedDate DATETIME NOT NULL CONSTRAINT DF_JobControl_CreatedDate DEFAULT (GETDATE()),
+ Frequency CHAR(20) NOT NULL CONSTRAINT DF_JobControl_Frequency DEFAULT ('DAILY'),
+ FrequencyPattern NVARCHAR(500) NULL, -- JSON scheduling rule
+
+ CONSTRAINT PK_JobControl PRIMARY KEY CLUSTERED (JobID ASC),
+ CONSTRAINT UQ_JobControl_JobName UNIQUE NONCLUSTERED (JobName ASC),
+ CONSTRAINT CK_JobControl_SchedulerAction CHECK (SchedulerAction IN ('STOP', 'CONTINUE'))
+);
+GO
+
+-- Create job dependencies table
+CREATE TABLE dbo.JobDependencies (
+ DependencyID INT IDENTITY(1,1) PRIMARY KEY,
+ JobName VARCHAR(50) NOT NULL,
+ PredecessorJobName VARCHAR(50) NULL,
+ FOREIGN KEY (JobName) REFERENCES dbo.JobControl(JobName)
+);
+GO
+
+-- Create execution history table
+CREATE TABLE dbo.JobExecutionHistory (
+ ExecutionID INT IDENTITY(1,1) PRIMARY KEY,
+ JobName VARCHAR(50) NOT NULL,
+ RunDate DATE NOT NULL,
+ ScheduledStartTime TIME NOT NULL,
+ ActualStartTime DATETIME NULL,
+ ActualEndTime DATETIME NULL,
+ Status VARCHAR(20) DEFAULT 'Pending' CHECK (Status IN ('Pending', 'Running', 'Success', 'Failed', 'ForceComplete')),
+ ErrorMessage VARCHAR(MAX) NULL,
+ OverrideFlag BIT DEFAULT 0,
+ OverrideBy VARCHAR(100) NULL,
+ OverrideDate DATETIME NULL
+);
+GO
+
+-- Create holidays table
+CREATE TABLE dbo.FederalHolidays (
+ HolidayID INT IDENTITY(1,1) PRIMARY KEY,
+ HolidayDate DATE NOT NULL UNIQUE,
+ HolidayName VARCHAR(100) NOT NULL,
+ Year INT NOT NULL
+);
+GO
+
+-- Create Exit Code table for PowerShell Script
+CREATE TABLE dbo.JobExitCodes
+(
+ JobExecutionID INT IDENTITY(1,1) PRIMARY KEY, -- unique ID per execution
+ JobName NVARCHAR(128) NOT NULL, -- job name
+ RunDate DATE NOT NULL, -- date of execution
+ ExitCode INT NOT NULL, -- exit code from job
+ RecordedTime DATETIME NOT NULL DEFAULT GETDATE() -- timestamp of execution
+);
+GO
+-- Create JobSchedule table
+CREATE TABLE dbo.JobSchedule (
+ JobScheduleID INT IDENTITY(1,1) PRIMARY KEY,
+ JobName VARCHAR(100) NOT NULL,
+ Frequency VARCHAR(20) CHECK (Frequency IN ('Monthly','Quarterly')),
+ ScheduledRule NVARCHAR(500) NULL, -- Copy of JSON or rule text from JobControl
+ ScheduledDate DATE NOT NULL, -- Planned date (before adjustment)
+ AdjustedRunDate DATE NOT NULL, -- Final working-day adjusted date
+ MonthOfSchedule CHAR(7) NOT NULL, -- 'YYYY-MM'
+ YearOfSchedule INT NOT NULL,
+ CreatedOn DATETIME DEFAULT GETDATE(),
+ CreatedBy VARCHAR(50) DEFAULT SUSER_SNAME()
+);
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/1_Database_Setup/InsertHolidays.sql b/SqlAgent/03_Prod/1_Database_Setup/InsertHolidays.sql
new file mode 100644
index 0000000..9bef23e
--- /dev/null
+++ b/SqlAgent/03_Prod/1_Database_Setup/InsertHolidays.sql
@@ -0,0 +1,29 @@
+USE [ProdDUTASJobSchedule]
+GO
+SET IDENTITY_INSERT [dbo].[FederalHolidays] ON
+GO
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (1, CAST(N'2025-01-01' AS Date), N'New Years Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (2, CAST(N'2025-01-20' AS Date), N'Martin Luther King Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (3, CAST(N'2025-02-17' AS Date), N'Presidents Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (4, CAST(N'2025-05-26' AS Date), N'Memorial Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (5, CAST(N'2025-06-19' AS Date), N'Juneteenth Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (6, CAST(N'2025-07-04' AS Date), N'Independence Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (7, CAST(N'2025-09-01' AS Date), N'Labor Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (8, CAST(N'2025-10-13' AS Date), N'Columbus Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (9, CAST(N'2025-11-11' AS Date), N'Veterans Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (10, CAST(N'2025-11-27' AS Date), N'Thanksgiving Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (11, CAST(N'2025-12-25' AS Date), N'Christmas Day', 2025)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (12, CAST(N'2026-01-01' AS Date), N'New Years Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (13, CAST(N'2026-01-19' AS Date), N'Martin Luther King Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (14, CAST(N'2026-02-16' AS Date), N'Presidents Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (15, CAST(N'2026-05-25' AS Date), N'Memorial Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (16, CAST(N'2026-06-19' AS Date), N'Juneteenth Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (17, CAST(N'2026-07-03' AS Date), N'Independence Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (18, CAST(N'2026-09-07' AS Date), N'Labor Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (19, CAST(N'2026-10-12' AS Date), N'Columbus Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (20, CAST(N'2026-11-11' AS Date), N'Veterans Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (21, CAST(N'2026-11-26' AS Date), N'Thanksgiving Day', 2026)
+INSERT [dbo].[FederalHolidays] ([HolidayID], [HolidayDate], [HolidayName], [Year]) VALUES (22, CAST(N'2026-12-25' AS Date), N'Christmas Day', 2026)
+GO
+SET IDENTITY_INSERT [dbo].[FederalHolidays] OFF
+GO
diff --git a/SqlAgent/03_Prod/1_Database_Setup/InsertJobControl.sql b/SqlAgent/03_Prod/1_Database_Setup/InsertJobControl.sql
new file mode 100644
index 0000000..6be4559
--- /dev/null
+++ b/SqlAgent/03_Prod/1_Database_Setup/InsertJobControl.sql
@@ -0,0 +1,143 @@
+USE [ProdDUTASJobSchedule]
+GO
+SET IDENTITY_INSERT [dbo].[JobControl] ON
+GO
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (1, N'PROD_DAILY_DTSBX215', CAST(N'04:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (2, N'PROD_DAILY_DTSBX305', CAST(N'04:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (3, N'PROD_DAILY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (4, N'PROD_DAILY_GSIRQ300', CAST(N'06:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (5, N'PROD_DAILY_DTSRQ202', CAST(N'06:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (6, N'PROD_DAILY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (7, N'PROD_DAILY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (8, N'PROD_DAILY_DTSFT202', CAST(N'08:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (9, N'PROD_DAILY_DTSBX432', CAST(N'08:30:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (10, N'PROD_DAILY_DTSGACHD', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (11, N'PROD_DAILY_DTSBX303', CAST(N'10:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (12, N'PROD_DAILY_DTSGWAGE', CAST(N'14:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (13, N'PROD_DAILY_DTSGCHKS', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (14, N'PROD_DAILY_DTSESDAY', CAST(N'14:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (15, N'PROD_DAILY_DTSGPAYT', CAST(N'14:10:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (16, N'PROD_DAILY_DTSDX145', CAST(N'16:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (17, N'PROD_DAILY_DTSBX629', CAST(N'16:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (18, N'PROD_DAILY_DTSBX630', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (19, N'PROD_DAILY_DTSFRAUD', CAST(N'16:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (20, N'PROD_DAILY_DTSRACHD', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (21, N'PROD_DAILY_DTSBXACH', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (22, N'PROD_DAILY_DTSBXREG', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (23, N'PROD_DAILY_DTSBX430', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (24, N'PROD_DAILY_DTSBX626', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (25, N'PROD_DAILY_DTSBX530', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (26, N'PROD_DAILY_DTSBXREL', CAST(N'17:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (27, N'PROD_DAILY_DTSBX450', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (28, N'PROD_DAILY_DTSBX451', CAST(N'17:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (29, N'PROD_DAILY_DTSPACHD', CAST(N'18:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (30, N'PROD_DAILY_DTSPX148', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (31, N'PROD_DAILY_DTSRQ325', CAST(N'18:05:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (32, N'PROD_DAILY_DTSBX427', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (33, N'PROD_DAILY_DTSPDAY1', CAST(N'18:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (34, N'PROD_DAILY_DTSW4WGE', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (35, N'PROD_DAILY_DTSGSID2', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (36, N'PROD_DAILY_DTSGSID9', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (37, N'PROD_DAILY_DTSMIN01', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (38, N'PROD_DAILY_DTSMIN02', CAST(N'18:20:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (39, N'PROD_DAILY_DTSRQ459', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (40, N'PROD_DAILY_DTSBXPFL', CAST(N'19:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (41, N'PROD_DAILY_DESBD427', CAST(N'19:05:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (42, N'PROD_DAILY_DTSBX403', CAST(N'20:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (43, N'PROD_DAILY_DTSBE405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (44, N'PROD_DAILY_DTSBX405', CAST(N'20:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (45, N'PROD_DAILY_DTSRQ335', CAST(N'21:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (46, N'PROD_DAILY_DTSBX601', CAST(N'21:25:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.470' AS DateTime), N'DAILY ', N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (47, N'PROD_WEEKLY_DTSGSID0', CAST(N'06:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (48, N'PROD_WEEKLY_DTSGSID1', CAST(N'06:15:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (49, N'PROD_WEEKLY_DTSBX202', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (50, N'PROD_WEEKLY_DTSFT202', CAST(N'08:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Sat","Sun"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (51, N'PROD_WEEKLY_DTSBX470', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (52, N'PROD_WEEKLY_DTSBXREJ', CAST(N'17:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Tue","Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (53, N'PROD_WEEKLY_DTSPDAY7', CAST(N'19:10:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (54, N'PROD_WEEKLY_DTSBX122', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (55, N'PROD_WEEKLY_DTSRQ511', CAST(N'19:14:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Fri"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (56, N'PROD_WEEKLY_DTSRQ444', CAST(N'07:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (57, N'PROD_WEEKLY_DTSRQ126', CAST(N'09:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.487' AS DateTime), N'WEEKLY ', N'{"Frequency":"Weekly","Days":["Mon"]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (58, N'PROD_MONTHLY_DTSRQ414', CAST(N'18:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (59, N'PROD_MONTHLY_DTSPMON1', CAST(N'19:15:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (60, N'PROD_MONTHLY_DTSCHGVB', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (61, N'PROD_MONTHLY_DTSCHGVR', CAST(N'19:27:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (62, N'PROD_MONTHLY_DTSVBKUP', CAST(N'19:26:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (63, N'PROD_MONTHLY_DTSVRSTR', CAST(N'19:30:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (64, N'PROD_MONTHLY_DTSRQ442', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (65, N'PROD_MONTHLY_DTSBX460', CAST(N'19:35:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (66, N'PROD_MONTHLY_DTSRQ513', CAST(N'19:37:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"LastWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (67, N'PROD_MONTHLY_DTSCHGDC', CAST(N'13:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.493' AS DateTime), N'MONTHLY ', N'{"Frequency":"Monthly","Rule":"FirstWorkday"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (68, N'PROD_QUARTERLY_DTSRQ119', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":3}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (69, N'PROD_QUARTERLY_DTSRQ902', CAST(N'18:16:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (70, N'PROD_QUARTERLY_DTSBX500', CAST(N'21:25:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Months":[3,6,9,12],"Day":1}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (71, N'PROD_QUARTERLY_DTSRQ417', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":31},{"Month":8,"Day":31},{"Month":11,"Day":30}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (72, N'PROD_QUARTERLY_DTSRQ320', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":10},{"Month":5,"Day":10},{"Month":8,"Day":10},{"Month":11,"Day":10}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (73, N'PROD_QUARTERLY_DTSRQ713', CAST(N'00:00:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":3,"Day":31},{"Month":6,"Day":30},{"Month":9,"Day":30},{"Month":12,"Day":31}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (74, N'PROD_QUARTERLY_DTSBX468', CAST(N'15:00:00' AS Time), N'CONTINUE', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":28},{"Month":5,"Day":30},{"Month":7,"Day":31},{"Month":10,"Day":30}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (75, N'PROD_QUARTERLY_DTSCHGQ1', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (76, N'PROD_QUARTERLY_DTSCHGQ2', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Rule":"FirstWorkdayOfQuarter"}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (77, N'PROD_QUARTERLY_DTSRQ327', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (78, N'PROD_QUARTERLY_DTSRQ328', CAST(N'18:16:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":2,"Day":7},{"Month":5,"Day":7},{"Month":8,"Day":7},{"Month":11,"Day":7}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (79, N'PROD_QUARTERLY_DTSRQ412', CAST(N'18:07:00' AS Time), N'STOP', 1, CAST(N'2025-10-16T12:59:40.503' AS DateTime), N'QUARTERLY ', N'{"Frequency":"Quarterly","Schedule":[{"Month":1,"Day":15},{"Month":4,"Day":15},{"Month":7,"Day":15},{"Month":10,"Day":15}]}')
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (80, N'PROD_QUARTERLY_DTSRQ793', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (81, N'PROD_QUARTERLY_DTSWGE06', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (82, N'PROD_QUARTERLY_DTSCHGRT', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (83, N'PROD_QUARTERLY_DTSCHRGS', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (84, N'PROD_QUARTERLY_DTSRQ540', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (85, N'PROD_QUARTERLY_DTSRQ591', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (86, N'PROD_QUARTERLY_DTSRTCHG', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (87, N'PROD_QUARTERLY_DTSWGE01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (88, N'PROD_QUARTERLY_DESBD426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (89, N'PROD_ONDEMAND_DTSACH01', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (90, N'PROD_ONDEMAND_DTSBX415', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (91, N'PROD_ONDEMAND_DTSBX452', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (92, N'PROD_ONDEMAND_DTSBX453', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (93, N'PROD_ONDEMAND_DTSRQ120', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (94, N'PROD_ONDEMAND_DTSRQ123', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (95, N'PROD_ONDEMAND_DTSRQ125', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (96, N'PROD_ONDEMAND_DTSRQ305', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (97, N'PROD_ONDEMAND_DTSRQ306', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (98, N'PROD_ONDEMAND_DTSRQ308', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (99, N'PROD_ONDEMAND_DTSRQ311', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (100, N'PROD_ONDEMAND_DTSRQ410', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (101, N'PROD_ONDEMAND_DTSRQ411', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (102, N'PROD_ONDEMAND_DTSRQ423', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (103, N'PROD_ONDEMAND_DTSRQ426', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (104, N'PROD_ONDEMAND_DTSRQ429', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (105, N'PROD_ONDEMAND_DTSRQ439', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (106, N'PROD_ONDEMAND_DTSRQ602', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (107, N'PROD_ONDEMAND_DTSRQ606', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (108, N'PROD_ONDEMAND_DTSRQ607', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (109, N'PROD_ONDEMAND_DTSRQ609', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (110, N'PROD_ONDEMAND_DTSRQ611', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (111, N'PROD_ONDEMAND_DTSRQ612', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (112, N'PROD_ONDEMAND_DTSRQ717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (113, N'PROD_ONDEMAND_DTSRQ718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (114, N'PROD_ONDEMAND_DTSRQ720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (115, N'PROD_ONDEMAND_DTSRQ721', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (116, N'PROD_ONDEMAND_DTSRT715', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (117, N'PROD_ONDEMAND_DTSRT716', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (118, N'PROD_ONDEMAND_DTSRT717', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (119, N'PROD_ONDEMAND_DTSRT718', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (120, N'PROD_ONDEMAND_DTSRT719', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (121, N'PROD_ONDEMAND_DTSRT720', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (122, N'PROD_ONDEMAND_DTSRT722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (123, N'PROD_ONDEMAND_DTSRT723', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.520' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (124, N'PROD_YEARLY_DTSRQ722', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (125, N'PROD_YEARLY_DTSRQ451', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (126, N'PROD_YEARLY_DTSRQ127', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (127, N'PROD_YEARLY_DTSRQ321', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (128, N'PROD_YEARLY_DTSRQ455', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (129, N'PROD_YEARLY_DTSRQ500', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (130, N'PROD_YEARLY_DTSRQ517', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (131, N'PROD_YEARLY_DTSRQ518', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (132, N'PROD_YEARLY_DTSRQ616', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (133, N'PROD_YEARLY_DTSRQ701', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (134, N'PROD_YEARLY_DTSRQ702', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (135, N'PROD_YEARLY_DTSRQ704', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+INSERT [dbo].[JobControl] ([JobID], [JobName], [ScheduledStartTime], [SchedulerAction], [IsActive], [CreatedDate], [Frequency], [FrequencyPattern]) VALUES (136, N'PROD_YEARLY_DTSRQ910', CAST(N'00:00:00' AS Time), N'STOP', 0, CAST(N'2025-10-16T12:59:40.530' AS DateTime), N'ONDEMAND ', NULL)
+GO
+SET IDENTITY_INSERT [dbo].[JobControl] OFF
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/1_Database_Setup/InsertJobDependencies.sql b/SqlAgent/03_Prod/1_Database_Setup/InsertJobDependencies.sql
new file mode 100644
index 0000000..dcb04d0
--- /dev/null
+++ b/SqlAgent/03_Prod/1_Database_Setup/InsertJobDependencies.sql
@@ -0,0 +1,92 @@
+USE [ProdDUTASJobSchedule]
+GO
+SET IDENTITY_INSERT [dbo].[JobDependencies] ON
+GO
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (1, N'PROD_DAILY_DTSGSID0', N'PROD_DAILY_DTSBX305')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (2, N'PROD_DAILY_GSIRQ300', N'PROD_DAILY_DTSBX305')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (3, N'PROD_DAILY_DTSRQ202', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (4, N'PROD_DAILY_DTSGSID1', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (5, N'PROD_DAILY_DTSBX202', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (6, N'PROD_DAILY_DTSFT202', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (7, N'PROD_DAILY_DTSBX432', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (8, N'PROD_DAILY_DTSGACHD', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (9, N'PROD_DAILY_DTSBX303', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (10, N'PROD_DAILY_DTSGWAGE', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (11, N'PROD_DAILY_DTSGCHKS', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (12, N'PROD_DAILY_DTSESDAY', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (13, N'PROD_DAILY_DTSGPAYT', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (14, N'PROD_DAILY_DTSDX145', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (15, N'PROD_DAILY_DTSBX629', N'PROD_DAILY_GSIRQ300')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (16, N'PROD_DAILY_DTSBX630', N'PROD_DAILY_DTSBX629')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (17, N'PROD_DAILY_DTSFRAUD', N'PROD_DAILY_DTSBX629')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (18, N'PROD_DAILY_DTSRACHD', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (19, N'PROD_DAILY_DTSBXACH', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (20, N'PROD_DAILY_DTSBXREG', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (21, N'PROD_DAILY_DTSBX430', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (22, N'PROD_DAILY_DTSBX626', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (23, N'PROD_DAILY_DTSBX530', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (24, N'PROD_DAILY_DTSBXREL', N'PROD_DAILY_DTSFRAUD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (25, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBXACH')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (26, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBXREG')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (27, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBX430')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (28, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBX626')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (29, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBX530')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (30, N'PROD_DAILY_DTSBX450', N'PROD_DAILY_DTSBXREL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (31, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBXACH')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (32, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBXREG')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (33, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBX430')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (34, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBX626')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (35, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBX530')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (36, N'PROD_DAILY_DTSBX451', N'PROD_DAILY_DTSBXREL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (37, N'PROD_DAILY_DTSPACHD', N'PROD_DAILY_DTSBX450')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (38, N'PROD_DAILY_DTSPACHD', N'PROD_DAILY_DTSBX451')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (39, N'PROD_DAILY_DTSPX148', N'PROD_DAILY_DTSPACHD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (40, N'PROD_DAILY_DTSRQ325', N'PROD_DAILY_DTSPACHD')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (41, N'PROD_DAILY_DTSBX427', N'PROD_DAILY_DTSPX148')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (42, N'PROD_DAILY_DTSBX427', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (43, N'PROD_DAILY_DTSPDAY1', N'PROD_DAILY_DTSBX427')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (44, N'PROD_DAILY_DTSW4WGE', N'PROD_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (45, N'PROD_DAILY_DTSGSID2', N'PROD_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (46, N'PROD_DAILY_DTSGSID9', N'PROD_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (47, N'PROD_DAILY_DTSMIN01', N'PROD_DAILY_DTSW4WGE')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (48, N'PROD_DAILY_DTSMIN01', N'PROD_DAILY_DTSGSID2')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (49, N'PROD_DAILY_DTSMIN01', N'PROD_DAILY_DTSGSID9')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (50, N'PROD_DAILY_DTSMIN02', N'PROD_DAILY_DTSW4WGE')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (51, N'PROD_DAILY_DTSMIN02', N'PROD_DAILY_DTSGSID2')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (52, N'PROD_DAILY_DTSMIN02', N'PROD_DAILY_DTSGSID9')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (53, N'PROD_DAILY_DTSRQ459', N'PROD_DAILY_DTSMIN01')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (54, N'PROD_DAILY_DTSRQ459', N'PROD_DAILY_DTSMIN02')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (55, N'PROD_DAILY_DTSBXPFL', N'PROD_DAILY_DTSRQ459')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (56, N'PROD_DAILY_DESBD427', N'PROD_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (57, N'PROD_DAILY_DTSBX403', N'PROD_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (58, N'PROD_DAILY_DTSBE405', N'PROD_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (59, N'PROD_DAILY_DTSBX405', N'PROD_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (60, N'PROD_DAILY_DTSRQ335', N'PROD_DAILY_DTSBXPFL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (61, N'PROD_DAILY_DTSBX601', N'PROD_DAILY_DTSRQ335')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (62, N'PROD_WEEKLY_DTSBXREJ', N'PROD_DAILY_DTSBXREL')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (63, N'PROD_WEEKLY_DTSBX122', N'PROD_WEEKLY_DTSPDAY7')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (64, N'PROD_WEEKLY_DTSRQ511', N'PROD_WEEKLY_DTSPDAY7')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (65, N'PROD_MONTHLY_DTSRQ414', N'PROD_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (66, N'PROD_MONTHLY_DTSCHGVB', N'PROD_MONTHLY_DTSPMON1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (67, N'PROD_MONTHLY_DTSCHGVR', N'PROD_MONTHLY_DTSCHGVB')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (68, N'PROD_MONTHLY_DTSVBKUP', N'PROD_MONTHLY_DTSPMON1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (69, N'PROD_MONTHLY_DTSVRSTR', N'PROD_MONTHLY_DTSVBKUP')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (70, N'PROD_MONTHLY_DTSRQ442', N'PROD_MONTHLY_DTSRQ513')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (71, N'PROD_QUARTERLY_DTSRQ119', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (72, N'PROD_QUARTERLY_DTSRQ417', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (73, N'PROD_QUARTERLY_DTSRQ320', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (74, N'PROD_QUARTERLY_DTSRQ793', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (75, N'PROD_QUARTERLY_DTSCHGQ1', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (76, N'PROD_QUARTERLY_DTSRQ327', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (77, N'PROD_QUARTERLY_DTSRQ412', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (78, N'PROD_QUARTERLY_DTSRQ591', N'PROD_DAILY_DTSRQ325')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (79, N'PROD_QUARTERLY_DTSRQ902', N'PROD_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (80, N'PROD_QUARTERLY_DTSCHGQ2', N'PROD_DAILY_DTSPDAY1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (81, N'PROD_QUARTERLY_DTSCHGRT', N'PROD_QUARTERLY_DTSRQ591')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (82, N'PROD_QUARTERLY_DTSRQ328', N'PROD_QUARTERLY_DTSRQ327')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (83, N'PROD_QUARTERLY_DTSBX500', N'PROD_QUARTERLY_DTSRQ417')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (84, N'PROD_QUARTERLY_DTSRQ713', N'PROD_MONTHLY_DTSPMON1')
+INSERT [dbo].[JobDependencies] ([DependencyID], [JobName], [PredecessorJobName]) VALUES (85, N'PROD_QUARTERLY_DTSCHRGS', N'PROD_QUARTERLY_DTSCHGRT')
+GO
+SET IDENTITY_INSERT [dbo].[JobDependencies] OFF
+GO
diff --git a/SqlAgent/03_Prod/2_Functions/fn_GetNextWorkday.sql b/SqlAgent/03_Prod/2_Functions/fn_GetNextWorkday.sql
new file mode 100644
index 0000000..2022e41
--- /dev/null
+++ b/SqlAgent/03_Prod/2_Functions/fn_GetNextWorkday.sql
@@ -0,0 +1,17 @@
+USE ProdDUTASJobSchedule;
+GO
+-- Returns the next valid workday on or after the given date
+CREATE OR ALTER FUNCTION dbo.fn_GetNextWorkday (@InputDate DATE)
+RETURNS DATE
+AS
+BEGIN
+ DECLARE @Workday DATE = @InputDate;
+
+ WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday)
+ BEGIN
+ SET @Workday = DATEADD(DAY, 1, @Workday);
+ END
+
+ RETURN @Workday;
+END;
diff --git a/SqlAgent/03_Prod/2_Functions/fn_GetPreviousWorkday.sql b/SqlAgent/03_Prod/2_Functions/fn_GetPreviousWorkday.sql
new file mode 100644
index 0000000..970562d
--- /dev/null
+++ b/SqlAgent/03_Prod/2_Functions/fn_GetPreviousWorkday.sql
@@ -0,0 +1,17 @@
+USE ProdDUTASJobSchedule;
+GO
+-- Returns the most recent valid workday before or equal to the given date
+CREATE OR ALTER FUNCTION dbo.fn_GetPreviousWorkday (@InputDate DATE)
+RETURNS DATE
+AS
+BEGIN
+ DECLARE @Workday DATE = @InputDate;
+
+ WHILE DATENAME(WEEKDAY, @Workday) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = @Workday)
+ BEGIN
+ SET @Workday = DATEADD(DAY, -1, @Workday);
+ END
+
+ RETURN @Workday;
+END;
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_CheckJobConditions.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CheckJobConditions.sql
new file mode 100644
index 0000000..60e8414
Binary files /dev/null and b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CheckJobConditions.sql differ
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql
new file mode 100644
index 0000000..c0ef0d1
Binary files /dev/null and b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CheckJobConditions_Generic.sql differ
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql
new file mode 100644
index 0000000..c2cd1ea
--- /dev/null
+++ b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateDailyJobSchedule.sql
@@ -0,0 +1,98 @@
+USE msdb;
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_CreateDailyJobSchedule
+ @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE
+ @JobID INT,
+ @JobName SYSNAME,
+ @ScheduledStartTime TIME(0),
+ @Frequency NVARCHAR(20),
+ @FrequencyPattern NVARCHAR(MAX),
+ @ScheduleName SYSNAME,
+ @StartTimeInt INT,
+ @FreqInterval INT,
+ @TimeString VARCHAR(8),
+ @ActiveStartDate INT,
+ @dbName SYSNAME; -- Added variable for database name
+
+ -- Determine database name based on environment
+ SET @dbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ END;
+
+ -- Prepare active start date as INT (YYYYMMDD)
+ SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112));
+
+ -- Dynamic SQL to fetch jobs from the appropriate database
+ DECLARE @Sql NVARCHAR(MAX);
+ SET @Sql = N'
+ DECLARE job_cursor CURSOR FOR
+ SELECT JobID, JobName, ScheduledStartTime, Frequency, FrequencyPattern
+ FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl
+ WHERE UPPER(Frequency) = ''DAILY''
+ AND IsActive = 1;';
+
+ -- Execute dynamic SQL to declare cursor
+ EXEC sp_executesql @Sql;
+
+ OPEN job_cursor;
+ FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ -- Step 1: Convert ScheduledStartTime (TIME) to HH:MM:SS string
+ SET @TimeString = CONVERT(VARCHAR(8), @ScheduledStartTime, 108);
+
+ -- Step 2: Remove colons and convert to INT (HHMMSS)
+ SET @StartTimeInt = CONVERT(INT, REPLACE(@TimeString, ':', ''));
+
+ -- Step 3: Prepare schedule name
+ SET @ScheduleName = CONCAT(@JobName, '_DailySchedule');
+
+ -- Step 4: Fixed freq_interval for Monday to Friday
+ SET @FreqInterval = 62; -- Mon(2)+Tue(4)+Wed(8)+Thu(16)+Fri(32) = 62
+
+ -- Step 5: Delete existing schedule if it exists (idempotency)
+ IF EXISTS (
+ SELECT 1
+ FROM msdb.dbo.sysschedules s
+ JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id
+ JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id
+ WHERE j.name = @JobName AND s.name = @ScheduleName
+ )
+ BEGIN
+ EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName;
+ END
+
+ -- Step 6: Create weekly schedule (Monday to Friday) running once per day
+ EXEC msdb.dbo.sp_add_schedule
+ @schedule_name = @ScheduleName,
+ @enabled = 1,
+ @freq_type = 8, -- weekly
+ @freq_interval = @FreqInterval,
+ @freq_recurrence_factor = 1, -- every week
+ @active_start_time = @StartTimeInt,
+ @active_start_date = @ActiveStartDate;
+
+ -- Step 7: Attach schedule to job
+ EXEC msdb.dbo.sp_attach_schedule
+ @job_name = @JobName,
+ @schedule_name = @ScheduleName;
+
+ -- Fetch next job
+ FETCH NEXT FROM job_cursor INTO @JobID, @JobName, @ScheduledStartTime, @Frequency, @FrequencyPattern;
+ END
+
+ CLOSE job_cursor;
+ DEALLOCATE job_cursor;
+
+ PRINT 'Daily job schedules (Monday to Friday) created successfully for ' + @dbName;
+END;
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateSQLAgentJob.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateSQLAgentJob.sql
new file mode 100644
index 0000000..cfba9e9
Binary files /dev/null and b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateSQLAgentJob.sql differ
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateWeeklySchedules.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateWeeklySchedules.sql
new file mode 100644
index 0000000..2021821
--- /dev/null
+++ b/SqlAgent/03_Prod/3_Stored_Procedures/usp_CreateWeeklySchedules.sql
@@ -0,0 +1,223 @@
+USE [msdb];
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_CreateWeeklySchedules
+ @Env VARCHAR(10) = 'DEVL' -- Added parameter with default value
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE
+ @JobName SYSNAME,
+ @FrequencyPattern NVARCHAR(MAX),
+ @StartTime VARCHAR(50),
+ @ScheduleName SYSNAME,
+ @StartTimeInt INT,
+ @FreqInterval INT,
+ @ActiveDate INT,
+ @computedFreq INT,
+ @dbName SYSNAME; -- Added variable for database name
+
+ -- Determine database name based on environment
+ SET @dbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ END;
+
+ SET @ActiveDate = CONVERT(INT, CONVERT(CHAR(8), GETDATE(), 112));
+
+ --------------------------------------------------------------------------
+ -- Dynamic SQL for cursor to fetch active weekly jobs from appropriate database
+ --------------------------------------------------------------------------
+ DECLARE @Sql NVARCHAR(MAX);
+ SET @Sql = N'
+ DECLARE job_cursor CURSOR FAST_FORWARD FOR
+ SELECT
+ JobName,
+ FrequencyPattern,
+ ScheduledStartTime
+ FROM ' + QUOTENAME(@dbName) + N'.dbo.JobControl
+ WHERE UPPER(Frequency) = ''WEEKLY''
+ AND IsActive = 1;';
+
+ -- Execute dynamic SQL to declare cursor
+ EXEC sp_executesql @Sql;
+
+ OPEN job_cursor;
+ FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ BEGIN TRY
+ ------------------------------------------------------------------
+ -- Reset per-job variables
+ ------------------------------------------------------------------
+ SET @FreqInterval = 0;
+ SET @computedFreq = 0;
+ SET @StartTimeInt = NULL;
+ SET @ScheduleName = NULL;
+
+ ------------------------------------------------------------------
+ -- Correctly format the start time (HHMMSS without extra zeros)
+ ------------------------------------------------------------------
+ SET @StartTime = LTRIM(RTRIM(ISNULL(@StartTime, '00:00:00')));
+
+ -- Parse time and convert to HHMMSS integer
+ DECLARE @TimeParts TABLE (part NVARCHAR(10), idx INT);
+ INSERT INTO @TimeParts (part, idx)
+ SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1
+ FROM STRING_SPLIT(LEFT(@StartTime, 8), ':');
+
+ DECLARE @Hours INT, @Minutes INT, @Seconds INT;
+
+ SELECT @Hours = CAST(part AS INT) FROM @TimeParts WHERE idx = 0;
+ SELECT @Minutes = CAST(part AS INT) FROM @TimeParts WHERE idx = 1;
+ SELECT @Seconds = CAST(part AS INT) FROM @TimeParts WHERE idx = 2;
+
+ -- Ensure valid time ranges
+ SET @Hours = ISNULL(@Hours, 0);
+ SET @Minutes = ISNULL(@Minutes, 0);
+ SET @Seconds = ISNULL(@Seconds, 0);
+
+ IF @Hours < 0 OR @Hours > 23 SET @Hours = 0;
+ IF @Minutes < 0 OR @Minutes > 59 SET @Minutes = 0;
+ IF @Seconds < 0 OR @Seconds > 59 SET @Seconds = 0;
+
+ SET @StartTimeInt = (@Hours * 10000) + (@Minutes * 100) + @Seconds;
+
+ SET @ScheduleName = CONCAT(@JobName, '_WeeklySchedule');
+
+ ------------------------------------------------------------------
+ -- Parse JSON days using a local temporary table
+ ------------------------------------------------------------------
+ CREATE TABLE #Days (DayName NVARCHAR(10));
+
+ INSERT INTO #Days (DayName)
+ SELECT TRIM(value)
+ FROM OPENJSON(ISNULL(@FrequencyPattern, '{}'), '$.Days');
+
+ ------------------------------------------------------------------
+ -- Compute bitmask correctly (values should be 1-127)
+ ------------------------------------------------------------------
+ SELECT @computedFreq = ISNULL(SUM(
+ CASE UPPER(DayName)
+ WHEN 'SUN' THEN 1
+ WHEN 'MON' THEN 2
+ WHEN 'TUE' THEN 4
+ WHEN 'WED' THEN 8
+ WHEN 'THU' THEN 16
+ WHEN 'FRI' THEN 32
+ WHEN 'SAT' THEN 64
+ ELSE 0
+ END
+ ), 0)
+ FROM #Days;
+
+ DROP TABLE #Days; -- Explicitly drop the temp table
+
+ SET @FreqInterval = ISNULL(@computedFreq, 0);
+
+ ------------------------------------------------------------------
+ -- Validate freq_interval (must be 1..127)
+ ------------------------------------------------------------------
+ IF @FreqInterval < 1 OR @FreqInterval > 127
+ BEGIN
+ PRINT 'Warning: Weekly job ' + @JobName +
+ ' has invalid freq_interval (' + ISNULL(CAST(@FreqInterval AS VARCHAR(10)), 'NULL') +
+ '). Days found: ' + ISNULL(@FrequencyPattern, 'None') + '. Skipping.';
+ FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime;
+ CONTINUE;
+ END
+
+ ------------------------------------------------------------------
+ -- Debug output to verify calculations
+ ------------------------------------------------------------------
+ PRINT 'Job: ' + @JobName +
+ ', Days: ' + @FrequencyPattern +
+ ', FreqInterval: ' + CAST(@FreqInterval AS VARCHAR(3)) +
+ ', StartTime: ' + CAST(@StartTimeInt AS VARCHAR(6));
+
+ ------------------------------------------------------------------
+ -- Safely detach and delete any existing schedule with this name
+ -- Use TRY/CATCH for schedule operations since non-existence is expected
+ ------------------------------------------------------------------
+ BEGIN TRY
+ DECLARE @schedule_id INT;
+ DECLARE @attach_count INT;
+
+ -- Check if schedule exists and get its ID
+ SELECT @schedule_id = s.schedule_id
+ FROM msdb.dbo.sysschedules s
+ JOIN msdb.dbo.sysjobschedules js ON s.schedule_id = js.schedule_id
+ JOIN msdb.dbo.sysjobs j ON j.job_id = js.job_id
+ WHERE j.name = @JobName AND s.name = @ScheduleName;
+
+ IF @schedule_id IS NOT NULL
+ BEGIN
+ -- Detach from this job (if attached)
+ EXEC msdb.dbo.sp_detach_schedule
+ @job_name = @JobName,
+ @schedule_name = @ScheduleName;
+
+ -- Check if schedule still attached to other jobs
+ SELECT @attach_count = COUNT(*)
+ FROM msdb.dbo.sysjobschedules js
+ WHERE js.schedule_id = @schedule_id;
+
+ IF @attach_count = 0
+ BEGIN
+ EXEC msdb.dbo.sp_delete_schedule
+ @schedule_name = @ScheduleName;
+ PRINT 'Existing schedule deleted: ' + @ScheduleName;
+ END
+ ELSE
+ BEGIN
+ PRINT 'Notice: schedule ' + @ScheduleName + ' could not be deleted because it is still attached to other jobs.';
+ END
+ END
+ END TRY
+ BEGIN CATCH
+ -- Schedule operations might fail if schedule doesn't exist, which is fine
+ PRINT 'Notice: ' + ERROR_MESSAGE() + ' - proceeding with new schedule creation.';
+ END CATCH
+
+ ------------------------------------------------------------------
+ -- Create the unified weekly schedule with subday config
+ ------------------------------------------------------------------
+ EXEC msdb.dbo.sp_add_schedule
+ @schedule_name = @ScheduleName,
+ @enabled = 1,
+ @freq_type = 8, -- Weekly
+ @freq_interval = @FreqInterval, -- Bitmask of weekdays
+ @freq_recurrence_factor = 1, -- Every week
+ @freq_subday_type = 1, -- Once per day
+ @freq_subday_interval = 1,
+ @active_start_time = @StartTimeInt,
+ @active_start_date = @ActiveDate;
+
+ ------------------------------------------------------------------
+ -- Attach the schedule to the job
+ ------------------------------------------------------------------
+ EXEC msdb.dbo.sp_attach_schedule
+ @job_name = @JobName,
+ @schedule_name = @ScheduleName;
+
+ PRINT 'Weekly schedule created for job: ' + @JobName +
+ ' (Days=' + CAST(@FreqInterval AS VARCHAR(10)) +
+ ', Time=' + RIGHT('000000' + CAST(@StartTimeInt AS VARCHAR(6)), 6) + ')';
+
+ END TRY
+ BEGIN CATCH
+ PRINT 'Error scheduling job ' + ISNULL(@JobName, 'Unknown') + ': ' + ERROR_MESSAGE();
+ END CATCH;
+
+ FETCH NEXT FROM job_cursor INTO @JobName, @FrequencyPattern, @StartTime;
+ END
+
+ CLOSE job_cursor;
+ DEALLOCATE job_cursor;
+
+ PRINT 'All weekly job schedules processed for ' + @dbName;
+END;
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_ForceComplete.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_ForceComplete.sql
new file mode 100644
index 0000000..cbd4142
Binary files /dev/null and b/SqlAgent/03_Prod/3_Stored_Procedures/usp_ForceComplete.sql differ
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_GenerateJobSchedule.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_GenerateJobSchedule.sql
new file mode 100644
index 0000000..b15cd55
--- /dev/null
+++ b/SqlAgent/03_Prod/3_Stored_Procedures/usp_GenerateJobSchedule.sql
@@ -0,0 +1,261 @@
+USE [ProdDUTASJobSchedule];
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_GenerateJobSchedule
+ @Year INT
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ -------------------------------------------------------------------------
+ -- 1. Cleanup existing schedule data for this year
+ -------------------------------------------------------------------------
+ DELETE FROM dbo.JobSchedule WHERE YearOfSchedule = @Year;
+
+ -------------------------------------------------------------------------
+ -- 2. Variable declarations
+ -------------------------------------------------------------------------
+ DECLARE
+ @JobName VARCHAR(100),
+ @Frequency VARCHAR(20),
+ @Pattern NVARCHAR(2000),
+ @ScheduledTime TIME,
+ @RuleName NVARCHAR(100),
+ @Month INT,
+ @BaseDate DATE,
+ @ScheduledDate DATE,
+ @AdjustedDate DATE,
+ @FailSafeDate DATE = '9999-12-31';
+
+ -------------------------------------------------------------------------
+ -- 3. Temporary table to process jobs more efficiently
+ -------------------------------------------------------------------------
+ CREATE TABLE #JobProcessing (
+ JobName VARCHAR(100),
+ Frequency VARCHAR(20),
+ Pattern NVARCHAR(2000),
+ ScheduledTime TIME,
+ RuleName NVARCHAR(100),
+ MonthsJSON NVARCHAR(MAX),
+ DayNum INT,
+ HasExplicitSchedule BIT
+ );
+
+ -- Populate temporary table with parsed JSON data
+ INSERT INTO #JobProcessing (JobName, Frequency, Pattern, ScheduledTime, RuleName, MonthsJSON, DayNum, HasExplicitSchedule)
+ SELECT
+ jc.JobName,
+ jc.Frequency,
+ jc.FrequencyPattern,
+ jc.ScheduledStartTime,
+ JSON_VALUE(jc.FrequencyPattern, '$.Rule'),
+ JSON_QUERY(jc.FrequencyPattern, '$.Months'),
+ JSON_VALUE(jc.FrequencyPattern, '$.Day'),
+ CASE WHEN JSON_QUERY(jc.FrequencyPattern, '$.Schedule') IS NOT NULL THEN 1 ELSE 0 END
+ FROM dbo.JobControl jc
+ WHERE UPPER(jc.Frequency) IN ('MONTHLY','QUARTERLY')
+ AND jc.IsActive = 1;
+
+ -------------------------------------------------------------------------
+ -- 4. Process MONTHLY jobs
+ -------------------------------------------------------------------------
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ CASE
+ WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1))
+ WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1)))
+ ELSE @FailSafeDate
+ END AS ScheduledDate,
+ CASE
+ WHEN jp.RuleName = 'FirstWorkday' THEN dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, m.MonthNum, 1))
+ WHEN jp.RuleName = 'LastWorkday' THEN dbo.fn_GetPreviousWorkday(EOMONTH(DATEFROMPARTS(@Year, m.MonthNum, 1)))
+ ELSE @FailSafeDate
+ END AS AdjustedRunDate,
+ FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum)
+ WHERE jp.Frequency = 'MONTHLY'
+ AND jp.RuleName IN ('FirstWorkday', 'LastWorkday');
+
+ -- Handle monthly jobs with unknown rules
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ @FailSafeDate,
+ @FailSafeDate,
+ FORMAT(DATEFROMPARTS(@Year, m.MonthNum, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(MonthNum)
+ WHERE jp.Frequency = 'MONTHLY'
+ AND jp.RuleName NOT IN ('FirstWorkday', 'LastWorkday');
+
+ -------------------------------------------------------------------------
+ -- 5. Process QUARTERLY jobs - FirstWorkdayOfQuarter
+ -------------------------------------------------------------------------
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)),
+ dbo.fn_GetNextWorkday(DATEFROMPARTS(@Year, q.StartMonth, 1)),
+ FORMAT(DATEFROMPARTS(@Year, q.StartMonth, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ CROSS JOIN (VALUES (1),(4),(7),(10)) q(StartMonth)
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND jp.RuleName = 'FirstWorkdayOfQuarter';
+
+ -------------------------------------------------------------------------
+ -- 6. Process QUARTERLY jobs - Months array with Day number
+ -------------------------------------------------------------------------
+ ;WITH QuarterlyMonths AS (
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ CAST(m.[value] AS INT) AS MonthNum,
+ jp.DayNum
+ FROM #JobProcessing jp
+ CROSS APPLY OPENJSON(jp.MonthsJSON) m
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND jp.MonthsJSON IS NOT NULL
+ AND jp.DayNum IS NOT NULL
+ AND jp.RuleName IS NULL
+ AND jp.HasExplicitSchedule = 0
+ ),
+ QuarterlyDates AS (
+ SELECT
+ qm.JobName,
+ qm.Frequency,
+ qm.Pattern,
+ qm.MonthNum,
+ qm.DayNum,
+ CASE
+ WHEN qm.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1)))
+ THEN DATEFROMPARTS(@Year, qm.MonthNum, qm.DayNum)
+ ELSE EOMONTH(DATEFROMPARTS(@Year, qm.MonthNum, 1))
+ END AS BaseDate
+ FROM QuarterlyMonths qm
+ )
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ qd.JobName,
+ qd.Frequency,
+ qd.Pattern,
+ qd.BaseDate,
+ CASE
+ WHEN DATENAME(WEEKDAY, qd.BaseDate) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = qd.BaseDate)
+ THEN dbo.fn_GetPreviousWorkday(qd.BaseDate)
+ ELSE qd.BaseDate
+ END AS AdjustedRunDate,
+ FORMAT(qd.BaseDate, 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM QuarterlyDates qd;
+
+ -------------------------------------------------------------------------
+ -- 7. Process QUARTERLY jobs - Explicit Schedule array
+ -------------------------------------------------------------------------
+ ;WITH ExplicitSchedules AS (
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ s.[Month] AS MonthNum,
+ s.[Day] AS DayNum
+ FROM #JobProcessing jp
+ CROSS APPLY OPENJSON(jp.Pattern, '$.Schedule')
+ WITH (
+ [Month] INT '$.Month',
+ [Day] INT '$.Day'
+ ) s
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND jp.HasExplicitSchedule = 1
+ ),
+ ExplicitScheduleDates AS (
+ SELECT
+ es.JobName,
+ es.Frequency,
+ es.Pattern,
+ es.MonthNum,
+ es.DayNum,
+ CASE
+ WHEN es.DayNum <= DAY(EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1)))
+ THEN DATEFROMPARTS(@Year, es.MonthNum, es.DayNum)
+ ELSE EOMONTH(DATEFROMPARTS(@Year, es.MonthNum, 1))
+ END AS BaseDate
+ FROM ExplicitSchedules es
+ )
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ esd.JobName,
+ esd.Frequency,
+ esd.Pattern,
+ esd.BaseDate,
+ CASE
+ WHEN DATENAME(WEEKDAY, esd.BaseDate) IN ('Saturday','Sunday')
+ OR EXISTS (SELECT 1 FROM dbo.FederalHolidays WHERE HolidayDate = esd.BaseDate)
+ THEN dbo.fn_GetPreviousWorkday(esd.BaseDate)
+ ELSE esd.BaseDate
+ END AS AdjustedRunDate,
+ FORMAT(esd.BaseDate, 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM ExplicitScheduleDates esd;
+
+ -------------------------------------------------------------------------
+ -- 8. Handle any quarterly jobs that didn't match the patterns above
+ -------------------------------------------------------------------------
+ INSERT INTO dbo.JobSchedule (JobName, Frequency, ScheduledRule, ScheduledDate, AdjustedRunDate, MonthOfSchedule, YearOfSchedule, CreatedOn, CreatedBy)
+ SELECT
+ jp.JobName,
+ jp.Frequency,
+ jp.Pattern,
+ @FailSafeDate,
+ @FailSafeDate,
+ FORMAT(DATEFROMPARTS(@Year, 1, 1), 'yyyy-MM'),
+ @Year,
+ GETDATE(),
+ SYSTEM_USER
+ FROM #JobProcessing jp
+ WHERE jp.Frequency = 'QUARTERLY'
+ AND NOT EXISTS (
+ SELECT 1 FROM dbo.JobSchedule js
+ WHERE js.JobName = jp.JobName AND js.YearOfSchedule = @Year
+ );
+
+ -------------------------------------------------------------------------
+ -- 9. Cleanup and output
+ -------------------------------------------------------------------------
+ DROP TABLE #JobProcessing;
+
+ -- Update any NULL dates to fail-safe date
+ UPDATE dbo.JobSchedule
+ SET ScheduledDate = @FailSafeDate,
+ AdjustedRunDate = @FailSafeDate
+ WHERE YearOfSchedule = @Year
+ AND (ScheduledDate IS NULL OR AdjustedRunDate IS NULL);
+
+ DECLARE @RecordCount INT = (SELECT COUNT(*) FROM dbo.JobSchedule WHERE YearOfSchedule = @Year);
+
+ PRINT 'Job schedule generation completed for year ' + CAST(@Year AS VARCHAR(4)) +
+ '. Total records created: ' + CAST(@RecordCount AS VARCHAR(10));
+END;
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_ScheduleJob.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_ScheduleJob.sql
new file mode 100644
index 0000000..f6c2ffa
--- /dev/null
+++ b/SqlAgent/03_Prod/3_Stored_Procedures/usp_ScheduleJob.sql
@@ -0,0 +1,160 @@
+USE [msdb]
+GO
+
+/****** Object: StoredProcedure [dbo].[usp_ScheduleJob] Script Date: 10/18/2025 9:52:04 AM ******/
+SET ANSI_NULLS ON
+GO
+
+SET QUOTED_IDENTIFIER ON
+GO
+
+
+CREATE OR ALTER PROCEDURE [dbo].[usp_ScheduleJob]
+ @JobName NVARCHAR(100),
+ @Env CHAR(4), -- 'DEVL' | 'TEST' | 'PROD'
+ @RunDate DATE,
+ @RunTime TIME
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE
+ @JobId UNIQUEIDENTIFIER,
+ @ScheduleName NVARCHAR(200),
+ @dbName NVARCHAR(128),
+ @ActiveStartDate INT,
+ @ActiveStartTime INT,
+ @Sql NVARCHAR(MAX),
+ @JobExists BIT = 0,
+ @ScheduleId INT;
+
+ -- Table variable must be declared separately and at the top level
+ DECLARE @ExistingSchedules TABLE (
+ schedule_id INT,
+ schedule_name NVARCHAR(200)
+ );
+
+ -- Map environment to actual DB name
+ SET @dbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ ELSE 'DevlDUTASJobSchedule'
+ END;
+
+ -- Validate parameters
+ IF @Env NOT IN ('DEVL','TEST','PROD')
+ BEGIN
+ RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1);
+ RETURN;
+ END
+
+ IF @RunDate < CAST(GETDATE() AS DATE)
+ BEGIN
+ RAISERROR('RunDate cannot be in the past.', 16, 1);
+ RETURN;
+ END;
+
+ -- Check if job exists in JobControl table
+ SET @Sql = N'SELECT @JobExists = 1 FROM ' + QUOTENAME(@dbName) + '.dbo.JobControl WHERE JobName = @JobNameParam';
+
+ EXEC sp_executesql @Sql,
+ N'@JobNameParam NVARCHAR(100), @JobExists BIT OUTPUT',
+ @JobNameParam = @JobName,
+ @JobExists = @JobExists OUTPUT;
+
+ IF @JobExists = 0
+ BEGIN
+ RAISERROR('Job %s not found in JobControl table.', 16, 1, @JobName);
+ RETURN;
+ END;
+
+ -- Activate job in control table
+ SET @Sql = N'UPDATE ' + QUOTENAME(@dbName) + '.dbo.JobControl SET IsActive = 1 WHERE JobName = @JobNameParam';
+ EXEC sp_executesql @Sql,
+ N'@JobNameParam NVARCHAR(100)',
+ @JobNameParam = @JobName;
+
+ PRINT 'Job activated in JobControl.';
+
+ -- Convert date/time to SQL Agent format
+ SET @ActiveStartDate = CONVERT(INT, CONVERT(CHAR(8), @RunDate, 112));
+ SET @ActiveStartTime = DATEPART(HOUR, @RunTime) * 10000 +
+ DATEPART(MINUTE, @RunTime) * 100 +
+ DATEPART(SECOND, @RunTime);
+
+ SET @ScheduleName = @JobName + '_MonthlySchedule';
+
+ -- Get job id
+ SELECT @JobId = job_id
+ FROM msdb.dbo.sysjobs
+ WHERE name = @JobName;
+
+ IF @JobId IS NULL
+ BEGIN
+ RAISERROR('SQL Agent job "%s" not found.', 16, 1, @JobName);
+ RETURN;
+ END;
+
+ BEGIN TRY
+ BEGIN TRANSACTION;
+
+ -- Detach and delete all existing schedules for this job
+ INSERT INTO @ExistingSchedules (schedule_id, schedule_name)
+ SELECT s.schedule_id, s.name
+ FROM msdb.dbo.sysschedules AS s
+ INNER JOIN msdb.dbo.sysjobschedules AS js ON s.schedule_id = js.schedule_id
+ WHERE js.job_id = @JobId;
+
+ DECLARE @OldScheduleId INT, @OldScheduleName NVARCHAR(200);
+
+ DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
+ SELECT schedule_id, schedule_name FROM @ExistingSchedules;
+
+ OPEN cur;
+ FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ PRINT 'Detaching old schedule: ' + @OldScheduleName;
+ EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @OldScheduleName;
+
+ PRINT 'Deleting old schedule: ' + @OldScheduleName;
+ EXEC msdb.dbo.sp_delete_schedule @schedule_name = @OldScheduleName;
+
+ FETCH NEXT FROM cur INTO @OldScheduleId, @OldScheduleName;
+ END
+
+ CLOSE cur;
+ DEALLOCATE cur;
+
+ -- Create new one-time schedule
+ EXEC msdb.dbo.sp_add_schedule
+ @schedule_name = @ScheduleName,
+ @enabled = 1,
+ @freq_type = 1, -- One-time
+ @active_start_date = @ActiveStartDate,
+ @active_start_time = @ActiveStartTime;
+
+ -- Attach schedule to job
+ EXEC msdb.dbo.sp_attach_schedule
+ @job_id = @JobId,
+ @schedule_name = @ScheduleName;
+
+ COMMIT TRANSACTION;
+
+ PRINT 'New schedule created for job "' + @JobName +
+ '" on ' + CONVERT(VARCHAR(10), @RunDate, 120) +
+ ' at ' + CONVERT(VARCHAR(8), @RunTime, 108);
+ END TRY
+ BEGIN CATCH
+ IF @@TRANCOUNT > 0
+ ROLLBACK TRANSACTION;
+
+ DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
+ RAISERROR('Error creating schedule: %s', 16, 1, @ErrorMessage);
+ END CATCH;
+END;
+GO
+
+
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql
new file mode 100644
index 0000000..0fa2de9
--- /dev/null
+++ b/SqlAgent/03_Prod/3_Stored_Procedures/usp_ScheduleJobsForMonth.sql
@@ -0,0 +1,39 @@
+USE ProdDUTASJobSchedule;
+GO
+
+CREATE OR ALTER PROCEDURE dbo.usp_ScheduleJobsForMonth
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE @MonthKey CHAR(7) = FORMAT(GETDATE(), 'yyyy-MM');
+ DECLARE @Year INT = YEAR(GETDATE());
+ DECLARE @JobName VARCHAR(100);
+ DECLARE @RunDate DATE;
+ DECLARE @RunTime TIME;
+ DECLARE @Env VARCHAR(10) = 'PROD'; -- configurable per environment
+
+ DECLARE job_cursor CURSOR FOR
+ SELECT js.JobName, js.AdjustedRunDate, jc.ScheduledStartTime
+ FROM dbo.JobSchedule js
+ INNER JOIN dbo.JobControl jc ON js.JobName = jc.JobName
+ WHERE js.MonthOfSchedule = @MonthKey
+ AND jc.IsActive = 1;
+
+ OPEN job_cursor;
+ FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime;
+
+ WHILE @@FETCH_STATUS = 0
+ BEGIN
+ EXEC msdb.dbo.usp_ScheduleJob
+ @JobName = @JobName,
+ @Env = @Env,
+ @RunDate = @RunDate,
+ @RunTime = @RunTime;
+
+ FETCH NEXT FROM job_cursor INTO @JobName, @RunDate, @RunTime;
+ END
+
+ CLOSE job_cursor;
+ DEALLOCATE job_cursor;
+END
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_TriggerMissedJobs.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_TriggerMissedJobs.sql
new file mode 100644
index 0000000..c5fd42f
Binary files /dev/null and b/SqlAgent/03_Prod/3_Stored_Procedures/usp_TriggerMissedJobs.sql differ
diff --git a/SqlAgent/03_Prod/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql b/SqlAgent/03_Prod/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql
new file mode 100644
index 0000000..20c3f41
Binary files /dev/null and b/SqlAgent/03_Prod/3_Stored_Procedures/usp_UpdateJobStatus_Generic.sql differ
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/ActivateOnDemandJob.sql b/SqlAgent/03_Prod/4_Job_Maintenance/ActivateOnDemandJob.sql
new file mode 100644
index 0000000..f745ba3
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/ActivateOnDemandJob.sql
@@ -0,0 +1,10 @@
+USE msdb;
+GO
+
+-- Schedule PROD OnDemand Job on 03 Nov at 18:15 PM
+------------------------------------------------
+EXEC dbo.usp_ScheduleJob
+ @JobName='PROD_MONTHLY_DTSRQ414',
+ @Env='PROD',
+ @RunDate='2025-11-03',
+ @RunTime='18:15:00';
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/AddAllJobsToSQLAgent.sql b/SqlAgent/03_Prod/4_Job_Maintenance/AddAllJobsToSQLAgent.sql
new file mode 100644
index 0000000..e7367cd
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/AddAllJobsToSQLAgent.sql
@@ -0,0 +1,141 @@
+USE [msdb]
+GO
+
+-- Execute the stored procedure for each job
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX215', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX305', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID0', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_GSIRQ300', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ202', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID1', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX202', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSFT202', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX432', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGACHD', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX303', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGWAGE', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGCHKS', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSESDAY', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGPAYT', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSDX145', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX629', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX630', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSFRAUD', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRACHD', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXACH', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXREG', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX430', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX626', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX530', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXREL', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX450', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX451', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSPACHD', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSPX148', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ325', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX427', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSPDAY1', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSW4WGE', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID2', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSGSID9', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSMIN01', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSMIN02', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ459', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBXPFL', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DESBD427', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX403', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBE405', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX405', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSRQ335', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX601', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSGSID0', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSGSID1', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBX202', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSFT202', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBX470', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBXREJ', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSPDAY7', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSBX122', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSRQ511', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSRQ444', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_WEEKLY_DTSRQ126', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSRQ414', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSPMON1', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSCHGVB', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSCHGVR', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSVBKUP', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSVRSTR', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSRQ442', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSBX460', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSRQ513', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_MONTHLY_DTSCHGDC', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ119', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ902', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSBX500', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ417', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ320', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ713', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSBX468', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHGQ1', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHGQ2', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ327', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ328', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ412', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ793', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSWGE06', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHGRT', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSCHRGS', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ540', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRQ591', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSRTCHG', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DTSWGE01', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_QUARTERLY_DESBD426', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSACH01', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSBX415', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSBX452', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSBX453', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ120', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ123', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ125', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ305', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ306', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ308', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ311', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ410', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ411', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ423', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ426', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ429', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ439', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ602', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ606', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ607', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ609', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ611', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ612', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ717', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ718', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ720', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRQ721', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT715', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT716', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT717', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT718', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT719', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT720', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT722', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_ONDEMAND_DTSRT723', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ722', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ451', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ127', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ321', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ455', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ500', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ517', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ518', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ616', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ701', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ702', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ704', @Env = 'PROD';
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_YEARLY_DTSRQ910', @Env = 'PROD';
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/AddDailyJobSchedule.sql b/SqlAgent/03_Prod/4_Job_Maintenance/AddDailyJobSchedule.sql
new file mode 100644
index 0000000..b740c61
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/AddDailyJobSchedule.sql
@@ -0,0 +1 @@
+EXEC msdb.dbo.usp_CreateDailyJobSchedule @Env = 'PROD';
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/AddNewJobToSQLAgent.sql b/SqlAgent/03_Prod/4_Job_Maintenance/AddNewJobToSQLAgent.sql
new file mode 100644
index 0000000..345b3b7
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/AddNewJobToSQLAgent.sql
@@ -0,0 +1,5 @@
+USE [msdb]
+GO
+
+-- Create a job in SQL Agent (With Standard 3 steps approach)
+EXEC dbo.usp_CreateSQLAgentJob @JobName = 'PROD_DAILY_DTSBX215', @Env = 'PROD';
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/AddWeeklyJobSchedule.sql b/SqlAgent/03_Prod/4_Job_Maintenance/AddWeeklyJobSchedule.sql
new file mode 100644
index 0000000..9608202
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/AddWeeklyJobSchedule.sql
@@ -0,0 +1 @@
+EXEC msdb.dbo.usp_CreateWeeklySchedules @Env = 'PROD';
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/DailyJobScheduleLookup.sql b/SqlAgent/03_Prod/4_Job_Maintenance/DailyJobScheduleLookup.sql
new file mode 100644
index 0000000..b893457
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/DailyJobScheduleLookup.sql
@@ -0,0 +1,86 @@
+/********************************************************************************************
+ Section 1: Daily Job Schedule Lookup
+ --------------------------------------------------------------------------------------------
+ Description:
+ Returns all SQL Agent jobs scheduled to run on a given date, along with their control
+ status (IsActive) and configured runtime from JobControl.
+
+ Parameters:
+ @CheckDate - The date to check job schedules for.
+
+ Notes:
+ • Uses MSDB’s internal schedule definitions (sysschedules, sysjobschedules).
+ • Supports One-time, Daily, Weekly, and Monthly schedule types.
+ • Can easily be adapted for DEVL / TEST / PROD by changing @DbName.
+
+********************************************************************************************/
+USE msdb;
+GO
+
+DECLARE @CheckDate DATE = CAST(GETDATE() AS DATE); -- Change if needed
+DECLARE @CheckWeekday INT = DATEPART(WEEKDAY, @CheckDate);
+DECLARE @Env SYSNAME = 'DEVL'; -- Change for TEST or PROD
+DECLARE @DbName SYSNAME;
+
+-- Map environment to the right control DB
+SET @DbName = CASE @Env
+ WHEN 'DEVL' THEN 'DevlDUTASJobSchedule'
+ WHEN 'TEST' THEN 'TestDUTASJobSchedule'
+ WHEN 'PROD' THEN 'ProdDUTASJobSchedule'
+ END;
+
+DECLARE @Sql NVARCHAR(MAX);
+SET @Sql = N'
+SELECT
+ j.name AS SQLAgentJobName,
+ jc.JobName AS ControlJobName,
+ jc.ScheduledStartTime,
+ jc.IsActive,
+ s.name AS ScheduleName,
+ s.freq_type,
+ s.freq_interval,
+ s.freq_subday_type,
+ s.freq_subday_interval,
+ s.active_start_date,
+ CASE s.freq_type
+ WHEN 1 THEN ''One-time''
+ WHEN 4 THEN ''Daily''
+ WHEN 8 THEN ''Weekly''
+ WHEN 16 THEN ''Monthly''
+ ELSE ''Other''
+ END AS FrequencyType,
+ CASE
+ WHEN s.freq_type = 1
+ AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))
+ THEN 1
+ WHEN s.freq_type = 4
+ AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))
+ THEN 1
+ WHEN s.freq_type = 8 -- Weekly
+ AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0
+ THEN 1
+ WHEN s.freq_type = 16 -- Monthly
+ AND DAY(@CheckDateParam) = s.freq_interval
+ THEN 1
+ ELSE 0
+ END AS IsScheduledToday
+FROM msdb.dbo.sysjobs j
+JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id
+JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id
+LEFT JOIN ' + QUOTENAME(@DbName) + '.dbo.JobControl jc ON jc.JobName = j.name
+WHERE jc.IsActive = 1
+ AND (
+ (s.freq_type = 1 AND s.active_start_date = CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- One-time
+ OR (s.freq_type = 4 AND s.active_start_date <= CONVERT(INT, CONVERT(CHAR(8), @CheckDateParam, 112))) -- Daily
+ OR (s.freq_type = 8 AND (POWER(2, @CheckWeekdayParam - 1) & s.freq_interval) > 0) -- Weekly
+ OR (s.freq_type = 16 AND DAY(@CheckDateParam) = s.freq_interval) -- Monthly
+ )
+ORDER BY jc.ScheduledStartTime;
+';
+
+EXEC sp_executesql
+ @Sql,
+ N'@CheckDateParam DATE, @CheckWeekdayParam INT',
+ @CheckDateParam = @CheckDate,
+ @CheckWeekdayParam = @CheckWeekday;
+GO
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/DeactivateJob.sql b/SqlAgent/03_Prod/4_Job_Maintenance/DeactivateJob.sql
new file mode 100644
index 0000000..57c1e61
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/DeactivateJob.sql
@@ -0,0 +1,12 @@
+USE ProdDUTASJobSchedule;
+GO
+
+UPDATE dbo.JobControl
+SET IsActive = 0
+WHERE Frequency = 'MONTHLY';
+GO
+
+-- Optional: Verify changes
+SELECT JobName, Frequency, IsActive
+FROM dbo.JobControl
+WHERE Frequency = 'MONTHLY';
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/DeleteSchedule.sql b/SqlAgent/03_Prod/4_Job_Maintenance/DeleteSchedule.sql
new file mode 100644
index 0000000..77de122
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/DeleteSchedule.sql
@@ -0,0 +1,27 @@
+USE msdb;
+GO
+
+DECLARE @EnvPrefix NVARCHAR(50) = N'PROD'; -- <<< Change this to your environment prefix
+DECLARE @schedule_id INT;
+DECLARE @schedule_name NVARCHAR(128);
+
+DECLARE Sched_Cursor CURSOR FOR
+SELECT schedule_id, name
+FROM msdb.dbo.sysschedules
+WHERE name LIKE @EnvPrefix + '%'; -- Only schedules starting with the given prefix
+
+OPEN Sched_Cursor;
+FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name;
+
+WHILE @@FETCH_STATUS = 0
+BEGIN
+ PRINT 'Deleting schedule: ' + @schedule_name;
+ EXEC msdb.dbo.sp_delete_schedule @schedule_id = @schedule_id;
+ FETCH NEXT FROM Sched_Cursor INTO @schedule_id, @schedule_name;
+END
+
+CLOSE Sched_Cursor;
+DEALLOCATE Sched_Cursor;
+
+PRINT 'All SQL Agent schedules starting with prefix ' + @EnvPrefix + ' deleted successfully.';
+GO
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/DetachDeleteScheduleByName.sql b/SqlAgent/03_Prod/4_Job_Maintenance/DetachDeleteScheduleByName.sql
new file mode 100644
index 0000000..c6ddedc
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/DetachDeleteScheduleByName.sql
@@ -0,0 +1,13 @@
+-- If you know both the job name and schedule name
+DECLARE @JobName NVARCHAR(100) = 'PROD_MONTHLY_DTSCHGDC';
+DECLARE @ScheduleName NVARCHAR(200) = 'PROD_MONTHLY_DTSCHGDC_MonthlySchedule';
+DECLARE @JobId UNIQUEIDENTIFIER;
+
+-- Get job ID
+SELECT @JobId = job_id FROM msdb.dbo.sysjobs WHERE name = @JobName;
+
+-- Detach from specific job
+EXEC msdb.dbo.sp_detach_schedule @job_id = @JobId, @schedule_name = @ScheduleName;
+
+-- Then delete
+EXEC msdb.dbo.sp_delete_schedule @schedule_name = @ScheduleName;
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/FederalHolidaysDML.sql b/SqlAgent/03_Prod/4_Job_Maintenance/FederalHolidaysDML.sql
new file mode 100644
index 0000000..cbba159
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/FederalHolidaysDML.sql
@@ -0,0 +1,63 @@
+USE [ProdDUTASJobSchedule];
+GO
+
+/**************************************************************************************************
+-- FILE: FederalHolidays.sql
+-- PURPOSE: Manage FederalHolidays table - Create, Read, Update, Delete for a single holiday
+-- TABLE: dbo.FederalHolidays
+**************************************************************************************************/
+
+-------------------------------
+-- SELECT - View Holiday
+-------------------------------
+SELECT *
+FROM [dbo].[FederalHolidays]
+WHERE [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day';
+GO
+
+-------------------------------
+-- INSERT - Create Holiday
+-------------------------------
+INSERT INTO [dbo].[FederalHolidays]
+(
+ [HolidayDate],
+ [HolidayName],
+ [Year]
+)
+VALUES
+(
+ '2025-01-01', -- Holiday date
+ N'New Year''s Day', -- Holiday name
+ 2025 -- Year
+);
+GO
+
+-------------------------------
+-- UPDATE - Modify Holiday
+-------------------------------
+UPDATE [dbo].[FederalHolidays]
+SET
+ [HolidayName] = N'New Year''s Day (Observed)',
+ [HolidayDate] = '2025-01-02'
+WHERE
+ [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day';
+GO
+
+-------------------------------
+-- DELETE - Remove Holiday
+-------------------------------
+DELETE FROM [dbo].[FederalHolidays]
+WHERE [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day (Observed)';
+GO
+
+-------------------------------
+-- SELECT - View Holiday
+-------------------------------
+SELECT *
+FROM [dbo].[FederalHolidays]
+WHERE [Year] = 2025
+ AND [HolidayName] = N'New Year''s Day';
+GO
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/ForceCompleteJob.sql b/SqlAgent/03_Prod/4_Job_Maintenance/ForceCompleteJob.sql
new file mode 100644
index 0000000..452037f
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/ForceCompleteJob.sql
@@ -0,0 +1,16 @@
+USE ProdDUTASJobSchedule;
+GO
+
+-- 1. Check today's job status
+SELECT JobName, Status, ErrorMessage
+FROM dbo.JobExecutionHistory
+WHERE RunDate = CAST(GETDATE() AS DATE)
+AND JobName = 'PROD_WEEKLY_DTSGSID1';
+
+-- 2. Mark DTSBX305 as manually overridden
+EXEC dbo.usp_ForceComplete 'PROD_WEEKLY_DTSGSID1', 'Neeraj.Kumar';
+
+-- 3. Verify the override
+SELECT JobName, Status, OverrideBy, OverrideDate
+FROM dbo.JobExecutionHistory
+WHERE JobName = 'PROD_WEEKLY_DTSGSID1' AND RunDate = CAST(GETDATE() AS DATE);
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/GenerateJobScheduleTable.sql b/SqlAgent/03_Prod/4_Job_Maintenance/GenerateJobScheduleTable.sql
new file mode 100644
index 0000000..7a1224f
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/GenerateJobScheduleTable.sql
@@ -0,0 +1,10 @@
+USE ProdDUTASJobSchedule;
+GO
+
+-- Set Job Schedule for the Year 2025
+EXEC dbo.usp_GenerateJobSchedule @Year = 2025;
+GO
+
+-- Set Job Schedule for the Year 2026
+EXEC dbo.usp_GenerateJobSchedule @Year = 2026;
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/JobControlDML.sql b/SqlAgent/03_Prod/4_Job_Maintenance/JobControlDML.sql
new file mode 100644
index 0000000..e52f57e
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/JobControlDML.sql
@@ -0,0 +1,68 @@
+USE [ProdDUTASJobSchedule];
+GO
+
+/**************************************************************************************************
+-- FILE: JobControl.sql
+-- PURPOSE: Manage JobControl table - Create, Read, Update, Delete for a single job
+-- TABLE: dbo.JobControl
+**************************************************************************************************/
+
+-------------------------------
+-- SELECT - View Job Record
+-------------------------------
+SELECT *
+FROM [dbo].[JobControl]
+WHERE [JobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- INSERT - Create Job Record
+-------------------------------
+INSERT INTO [dbo].[JobControl]
+(
+ [JobName],
+ [ScheduledStartTime],
+ [SchedulerAction],
+ [IsActive],
+ [CreatedDate],
+ [Frequency],
+ [FrequencyPattern]
+)
+VALUES
+(
+ N'PROD_DAILY_DTSBX215', -- Job name
+ '14:00:00', -- 2 PM (24-hour format)
+ N'CONTINUE', -- Action
+ 1, -- Active
+ GETDATE(), -- Current system time
+ N'DAILY', -- Frequency
+ N'{"Frequency":"Daily","Days":["Mon","Tue","Wed","Thu","Fri"]}' -- JSON pattern
+);
+GO
+
+-------------------------------
+-- UPDATE - Modify Job Record
+-------------------------------
+UPDATE [dbo].[JobControl]
+SET
+ [ScheduledStartTime] = '15:00:00', -- Change to 3 PM
+ [SchedulerAction] = 'STOP', -- Change to STOP
+ [IsActive] = 0 -- Deactivate
+WHERE
+ [JobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- DELETE - Remove Job Record
+-------------------------------
+DELETE FROM [dbo].[JobControl]
+WHERE [JobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- SELECT - View Job Record
+-------------------------------
+SELECT *
+FROM [dbo].[JobControl]
+WHERE [JobName] = N'PROD_DAILY_DTSBX215';
+GO
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/JobDependenciesDML.sql b/SqlAgent/03_Prod/4_Job_Maintenance/JobDependenciesDML.sql
new file mode 100644
index 0000000..49586a3
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/JobDependenciesDML.sql
@@ -0,0 +1,56 @@
+USE [ProdDUTASJobSchedule];
+GO
+
+/**************************************************************************************************
+-- FILE: JobDependencies.sql
+-- PURPOSE: Manage JobDependencies table - Create, Read, Update, Delete for a single dependency
+-- TABLE: dbo.JobDependencies
+**************************************************************************************************/
+
+-------------------------------
+-- SELECT - View Dependency
+-------------------------------
+SELECT *
+FROM [dbo].[JobDependencies]
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0';
+GO
+
+-------------------------------
+-- INSERT - Create Dependency
+-------------------------------
+INSERT INTO [dbo].[JobDependencies]
+(
+ [JobName],
+ [PredecessorJobName]
+)
+VALUES
+(
+ N'PROD_DAILY_DTSGSID0', -- Dependent job
+ N'PROD_DAILY_DTSBX305' -- Predecessor job
+);
+GO
+
+-------------------------------
+-- UPDATE - Modify Dependency
+-------------------------------
+UPDATE [dbo].[JobDependencies]
+SET [PredecessorJobName] = N'PROD_DAILY_DTSBX215'
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0'
+ AND [PredecessorJobName] = N'PROD_DAILY_DTSBX305';
+GO
+
+-------------------------------
+-- DELETE - Remove Dependency
+-------------------------------
+DELETE FROM [dbo].[JobDependencies]
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0'
+ AND [PredecessorJobName] = N'PROD_DAILY_DTSBX215';
+GO
+
+-------------------------------
+-- SELECT - View Dependency
+-------------------------------
+SELECT *
+FROM [dbo].[JobDependencies]
+WHERE [JobName] = N'PROD_DAILY_DTSGSID0';
+GO
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/JobInfo.sql b/SqlAgent/03_Prod/4_Job_Maintenance/JobInfo.sql
new file mode 100644
index 0000000..b4a0514
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/JobInfo.sql
@@ -0,0 +1,47 @@
+USE msdb;
+GO
+
+PRINT '================================================================================';
+PRINT 'SECTION 1: JOB CONTROL INFORMATION';
+PRINT '================================================================================';
+GO
+
+-- View all active jobs
+SELECT JobName, ScheduledStartTime, Frequency, IsActive
+FROM ProdDUTASJobSchedule.dbo.JobControl
+WHERE IsActive = 1
+ORDER BY Frequency, ScheduledStartTime;
+GO
+
+-- View all inactive jobs
+SELECT JobName, Frequency, ScheduledStartTime
+FROM ProdDUTASJobSchedule.dbo.JobControl
+WHERE IsActive = 0
+ORDER BY Frequency;
+GO
+
+-- Find weekly/monthly jobs
+SELECT JobName, Frequency, ScheduledStartTime
+FROM ProdDUTASJobSchedule.dbo.JobControl
+WHERE Frequency IN ('WEEKLY', 'MONTHLY')
+ORDER BY Frequency, ScheduledStartTime;
+GO
+
+PRINT '================================================================================';
+PRINT 'SECTION 2: JOB DEPENDENCIES';
+PRINT '================================================================================';
+GO
+
+-- Check dependencies for a job
+DECLARE @Job NVARCHAR(100) = 'PROD_MONTHLY_DTSCHGVR';
+SELECT JobName, PredecessorJobName
+FROM ProdDUTASJobSchedule.dbo.JobDependencies
+WHERE JobName = @Job;
+GO
+
+-- Show dependency chain overview
+SELECT d.JobName, d.PredecessorJobName, jc.ScheduledStartTime, jc.Frequency
+FROM ProdDUTASJobSchedule.dbo.JobDependencies d
+JOIN ProdDUTASJobSchedule.dbo.JobControl jc ON d.JobName = jc.JobName
+ORDER BY jc.Frequency, jc.ScheduledStartTime;
+GO
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/SQLAgentInfo.sql b/SqlAgent/03_Prod/4_Job_Maintenance/SQLAgentInfo.sql
new file mode 100644
index 0000000..d63458e
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/SQLAgentInfo.sql
@@ -0,0 +1,42 @@
+USE msdb;
+GO
+
+PRINT '================================================================================';
+PRINT 'SECTION 1: SQL AGENT JOB STATUS';
+PRINT '================================================================================';
+GO
+
+-- List all jobs in SQL Agent
+SELECT name AS JobName, enabled, date_created, date_modified
+FROM msdb.dbo.sysjobs
+ORDER BY name;
+GO
+
+-- Job schedule summary
+SELECT j.name AS JobName, s.name AS ScheduleName,
+ s.enabled, s.freq_type, s.active_start_date, s.active_start_time
+FROM msdb.dbo.sysjobs j
+JOIN msdb.dbo.sysjobschedules js ON j.job_id = js.job_id
+JOIN msdb.dbo.sysschedules s ON js.schedule_id = s.schedule_id
+ORDER BY j.name;
+GO
+
+-- Last job run details
+SELECT j.name AS JobName,
+ h.run_status,
+ CASE h.run_status
+ WHEN 0 THEN 'Failed'
+ WHEN 1 THEN 'Succeeded'
+ WHEN 2 THEN 'Retry'
+ WHEN 3 THEN 'Canceled'
+ WHEN 4 THEN 'In Progress'
+ END AS StatusDescription,
+ msdb.dbo.agent_datetime(h.run_date, h.run_time) AS RunDateTime,
+ h.run_duration
+FROM dbo.sysjobs j
+LEFT JOIN dbo.sysjobhistory h ON j.job_id = h.job_id
+WHERE h.instance_id IN (
+ SELECT MAX(instance_id) FROM dbo.sysjobhistory GROUP BY job_id
+)
+ORDER BY RunDateTime DESC;
+GO
\ No newline at end of file
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/ScheduleJobsMonthly.sql b/SqlAgent/03_Prod/4_Job_Maintenance/ScheduleJobsMonthly.sql
new file mode 100644
index 0000000..508ebbc
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/ScheduleJobsMonthly.sql
@@ -0,0 +1,3 @@
+USE ProdDUTASJobSchedule;
+GO
+EXEC dbo.usp_ScheduleJobsForMonth;
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/TodaysExecution.sql b/SqlAgent/03_Prod/4_Job_Maintenance/TodaysExecution.sql
new file mode 100644
index 0000000..e116c74
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/TodaysExecution.sql
@@ -0,0 +1,21 @@
+USE ProdDUTASJobSchedule;
+GO
+
+DECLARE @Runday DATE = DATEADD(day, +0, CAST(GETDATE() AS DATE)); -- -1 for Yesterday
+
+SELECT
+ jeh.ExecutionID,
+ jeh.JobName,
+ jeh.RunDate,
+ jc.ScheduledStartTime,
+ jeh.ActualStartTime,
+ jeh.ActualEndTime,
+ jeh.Status,
+ jeh.ErrorMessage,
+ jeh.OverrideFlag,
+ jeh.OverrideBy
+FROM dbo.JobExecutionHistory jeh
+INNER JOIN dbo.JobControl jc
+ ON jeh.JobName = jc.JobName
+WHERE jeh.RunDate = @Runday
+ORDER BY jc.ScheduledStartTime, jeh.ActualStartTime;
diff --git a/SqlAgent/03_Prod/4_Job_Maintenance/TriggerMissedJob.sql b/SqlAgent/03_Prod/4_Job_Maintenance/TriggerMissedJob.sql
new file mode 100644
index 0000000..950d722
--- /dev/null
+++ b/SqlAgent/03_Prod/4_Job_Maintenance/TriggerMissedJob.sql
@@ -0,0 +1,9 @@
+USE [ProdDUTASJobSchedule]
+GO
+
+-- 1. Preview missed jobs (safe, no run):
+ EXEC dbo.usp_TriggerMissedJobs @DryRun = 1;
+
+-- 2. Actually trigger missed jobs:
+ EXEC dbo.usp_TriggerMissedJobs @DryRun = 0;
+
diff --git a/SqlAgent/03_Prod/5_PowerShell_Scripts/Execute-RemoteJob.ps1 b/SqlAgent/03_Prod/5_PowerShell_Scripts/Execute-RemoteJob.ps1
new file mode 100644
index 0000000..742e8b3
--- /dev/null
+++ b/SqlAgent/03_Prod/5_PowerShell_Scripts/Execute-RemoteJob.ps1
@@ -0,0 +1,118 @@
+param(
+[Parameter(Mandatory = $true)]
+[string]$JobName,
+
+```
+[Parameter(Mandatory = $true)]
+[ValidateSet('DEVL', 'TEST', 'PROD')]
+[string]$Env
+```
+
+)
+
+try {
+Write-Host "Starting job $JobName in environment $Env at $(Get-Date)"
+
+```
+# ------------------------------------------------------------
+# Extract JCL from JobName (ENV_FREQUENCY_JOB pattern)
+# ------------------------------------------------------------
+$JCL = $JobName -replace '^[A-Z]+_[A-Z]+_', ''
+Write-Host "Extracted JCL: $JCL from JobName: $JobName" -ForegroundColor Yellow
+
+# ------------------------------------------------------------
+# Environment-specific configuration
+# ------------------------------------------------------------
+switch ($Env.ToUpper()) {
+ 'DEVL' {
+ $ComputerName = '10.57.110.120'
+ $DatabaseName = 'DevlDUTASJobSchedule'
+ $SqlServer = 'DOES_DUTAS-SQL1'
+ }
+ 'TEST' {
+ $ComputerName = '10.57.110.141'
+ $DatabaseName = 'TestDUTASJobSchedule'
+ $SqlServer = 'DOES_DUTAS-SQL1'
+ }
+ 'PROD' {
+ $ComputerName = '10.57.111.120'
+ $DatabaseName = 'ProdDUTASJobSchedule'
+ $SqlServer = 'DOES_DUTAS-SQL'
+ }
+ default {
+ throw "Invalid environment specified: $Env"
+ }
+}
+
+# ------------------------------------------------------------
+# Remote credentials (consider secure vault in production)
+# ------------------------------------------------------------
+$username = "DUTASSQLAdminP@does.dcgov.priv"
+$password = "4ho@3Pr&Xof8" | ConvertTo-SecureString -AsPlainText -Force
+$credential = New-Object System.Management.Automation.PSCredential($username, $password)
+
+# ------------------------------------------------------------
+# Execute job remotely using the extracted JCL
+# ------------------------------------------------------------
+Write-Host "Connecting to remote server $ComputerName ..."
+$exitCode = Invoke-Command -ComputerName $ComputerName `
+ -Credential $credential `
+ -Authentication CredSSP `
+ -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) `
+ -ArgumentList $JobName, $JCL, $Env `
+ -ScriptBlock {
+ param($JobName, $JCL, $Env)
+ Write-Host "Remote execution - JobName: $JobName, JCL: $JCL, Env: $Env"
+
+ $process = Start-Process -FilePath "powershell.exe" `
+ -ArgumentList "-ExecutionPolicy Bypass -File `"E:\PSScript\RCSubmit-Job.ps1`" -JobName `"$JCL`" -Env `"$Env`"" `
+ -NoNewWindow -Wait -PassThru
+ return $process.ExitCode
+ }
+
+if (-not $exitCode) { $exitCode = 1 } # Guard for null/false exit codes
+
+if ($exitCode -eq 0) {
+ Write-Host "Job $JobName (JCL: $JCL) completed successfully at $(Get-Date)" -ForegroundColor Green
+} else {
+ Write-Error "Job $JobName (JCL: $JCL) failed with exit code: $exitCode"
+}
+```
+
+}
+catch {
+Write-Error "Job $JobName failed with error: $($_.Exception.Message)"
+$exitCode = 1
+}
+finally {
+# ------------------------------------------------------------
+# Log exit code to the appropriate database
+# ------------------------------------------------------------
+try {
+$connectionString = "Server=$SqlServer;Database=$DatabaseName;Trusted_Connection=true;"
+$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
+$connection.Open()
+
+```
+ $command = $connection.CreateCommand()
+ $command.CommandText = @"
+ INSERT INTO dbo.JobExitCodes (JobName, RunDate, ExitCode, RecordedTime)
+ VALUES ('$JobName', CAST(GETDATE() AS DATE), $exitCode, GETDATE());
+```
+
+"@
+$command.ExecuteNonQuery()
+$connection.Close()
+
+```
+ Write-Host "Exit code $exitCode logged to database $DatabaseName on $SqlServer for job $JobName"
+}
+catch {
+ $errorMsg = $_.Exception.Message
+ Write-Host "Failed to log exit code to database $DatabaseName on $SqlServer`: $errorMsg"
+}
+```
+
+}
+
+exit $exitCode
diff --git a/SqlAgent/03_Prod/5_PowerShell_Scripts/RCSubmit-Job.ps1 b/SqlAgent/03_Prod/5_PowerShell_Scripts/RCSubmit-Job.ps1
new file mode 100644
index 0000000..e603fc4
--- /dev/null
+++ b/SqlAgent/03_Prod/5_PowerShell_Scripts/RCSubmit-Job.ps1
@@ -0,0 +1,140 @@
+param(
+ [string]$JobName,
+ [string]$Env
+)
+
+# --- Parameter Validation ---
+if (-not $JobName) {
+ Write-Host "JobName parameter is required" -ForegroundColor Red
+ exit 1
+}
+if (-not $Env) {
+ Write-Host "Environment (Env) parameter is required" -ForegroundColor Red
+ exit 1
+}
+
+# --- Execute Job ---
+Write-Host "Submitting job: $JobName in environment: $Env" -ForegroundColor Cyan
+$output = & "$env:rcbin\submit.exe" -DSN="DOESTAX.$Env.JOBS.BATCH.LIB($JobName)"
+$exitCode = [int]$LASTEXITCODE
+$isSuccess = 0
+
+# --- Parse SYSLOG Path ---
+$syslogPath = $null
+$syslogFolder = "Not found"
+$content = @()
+$summary = @()
+
+try {
+ $syslogPath = $output | Select-String -Pattern "SYSLOG=\[(.*)\]" | ForEach-Object { $_.Matches.Groups[1].Value }
+
+ if ($syslogPath -and (Test-Path $syslogPath)) {
+ $syslogFolder = Split-Path $syslogPath -Parent
+ $content = Get-Content $syslogPath -ErrorAction Stop
+ $summary = $content | Select-String -Pattern "%Job Overall Stats:" -Context 0,7 | ForEach-Object {
+ $_.Context.PostContext | Select-Object -Skip 1 -First 5
+ }
+ } else {
+ Write-Host "SYSLOG path not found or inaccessible: $syslogPath" -ForegroundColor Yellow
+ $summary = @("SYSLOG file not found in output", "Raw output:", $output -join "`n")
+ }
+}
+catch {
+ Write-Host "Error processing SYSLOG: $($_.Exception.Message)" -ForegroundColor Yellow
+ $summary = @("Error reading SYSLOG: $($_.Exception.Message)", "Raw output:", $output -join "`n")
+}
+
+# --- Evaluate Return Codes ---
+$successConditions = @(
+ { $JobName -eq "GSIRQ300" -and $exitCode -eq 50 },
+ { $JobName -eq "DTSGWAGE" -and $exitCode -eq 8 },
+ { $JobName -eq "DTSGCHKS" -and $exitCode -eq 8 },
+ { $JobName -eq "DTSGPAYT" -and $exitCode -eq 8 },
+ { $JobName -eq "DTSBXACH" -and $exitCode -eq 2 },
+ { $JobName -eq "DTSBXREL" -and $exitCode -eq 2 },
+ { $JobName -eq "DTSMIN02" -and $exitCode -eq 4 },
+ { $JobName -eq "DTSBE405" -and $exitCode -eq 910 },
+ { $JobName -eq "DTSBXREJ" -and $exitCode -eq 4 },
+ { $JobName -eq "DTSRQ444" -and $exitCode -eq 4 },
+ { $exitCode -eq 0 }
+)
+
+if ($successConditions | Where-Object { & $_ }) {
+ Write-Host "Job $JobName succeeded with code $exitCode" -ForegroundColor Green
+ $isSuccess = 0
+} else {
+ Write-Host "Job $JobName failed with code $exitCode" -ForegroundColor Red
+ $isSuccess = 1
+ if ($summary.Count -eq 0) {
+ $summary = @($Error[0])
+ }
+}
+
+# --- Email Notification Settings ---
+$smtpServer = "smtp4.dc.gov"
+$fromEmail = "Dutas@dc.gov"
+$toEmail = "zarath.lalputan@dc.gov"
+$ccEmail = @("srujani.chandragiri@dc.gov", "neerajk@innovaconsulting.com")
+
+$emailBody = @"
+
+DUTAS Batch Job: $JobName Execution Report
+==========================================
+$($summary -join "`n")
+==========================================
+
+Return Code : $exitCode
+Status : $(if ($isSuccess -eq 0) { "SUCCESS" } else { "FAILED" })
+JOBLOG Path : $syslogFolder
+
+"@
+
+# --- Attachment Setup ---
+# Automatically attach MSGLOG.txt if it exists in the JOBLOG folder
+$attachmentPath = Join-Path $syslogFolder "MSGLOG.txt"
+
+$sendParams = @{
+ SmtpServer = $smtpServer
+ Port = 25
+ From = $fromEmail
+ To = $toEmail
+ Cc = $ccEmail
+ Subject = "DUTAS-[$Env] Job Status: $JobName - $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })"
+ Body = $emailBody
+ BodyAsHtml = $true
+}
+
+if (Test-Path $attachmentPath) {
+ $sendParams['Attachments'] = $attachmentPath
+ Write-Host "Attachment found: $attachmentPath" -ForegroundColor Cyan
+} else {
+ Write-Host "No MSGLOG.txt found at $syslogFolder" -ForegroundColor Yellow
+}
+
+# --- Conditional Email Sending ---
+# ===================================================================================
+# EMAIL SEND CONDITION TOGGLE:
+# By default, email will ALWAYS be sent whether the job succeeded or failed.
+# To send email ONLY if the job fails, uncomment the next line:
+# if ($isSuccess -eq 1) {
+# ===================================================================================
+
+try {
+ Write-Host "Preparing to send email to $toEmail..." -ForegroundColor Yellow
+ Send-MailMessage @sendParams
+ Write-Host "Email sent successfully to $toEmail" -ForegroundColor Cyan
+}
+catch {
+ Write-Host "Failed to send email: $($_.Exception.Message)" -ForegroundColor Yellow
+}
+
+# ===================================================================================
+# End of email send condition block (only required if you uncomment the IF above)
+# } # End Email send condition
+# ===================================================================================
+
+Write-Host "`n---------------------------------------------"
+Write-Host "Job: $JobName | ExitCode: $exitCode | Status: $(if ($isSuccess -eq 0) { 'SUCCESS' } else { 'FAILED' })"
+Write-Host "---------------------------------------------`n"
+
+exit $isSuccess
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/Backup-Restore-Guide.docx b/SqlAgent/03_Prod/6_Backup_Restore/Backup-Restore-Guide.docx
new file mode 100644
index 0000000..c19787a
Binary files /dev/null and b/SqlAgent/03_Prod/6_Backup_Restore/Backup-Restore-Guide.docx differ
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/Backup-SQLAgent.ps1 b/SqlAgent/03_Prod/6_Backup_Restore/Backup-SQLAgent.ps1
new file mode 100644
index 0000000..aa269ef
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/Backup-SQLAgent.ps1
@@ -0,0 +1,48 @@
+# ===================================================================
+# SQL Agent Jobs Backup Script (PowerShell)
+# Modern Version using SqlServer module
+# & "E:\Neeraj\SqlAgent\v2\01_Prod\6_Backup\Backup-SQLAgent.ps1" `
+# -ServerName "DOES-DUTAS-SQL" `
+# -BackupPath "\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\"
+#
+# ===================================================================
+
+param (
+ [Parameter(Mandatory = $true)]
+ [string]$ServerName,
+
+ [Parameter(Mandatory = $true)]
+ [string]$BackupPath
+)
+
+# Load SQL Server PowerShell module
+Import-Module SqlServer -ErrorAction Stop
+
+# Create timestamp and output paths
+$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
+$ZipFile = Join-Path $BackupPath "SQLAgentJobs_$Timestamp.zip"
+
+# Ensure backup folder exists
+if (-not (Test-Path $BackupPath)) {
+ New-Item -ItemType Directory -Path $BackupPath | Out-Null
+}
+
+# Connect to SQL Server
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
+
+# Export all jobs as individual SQL scripts
+$JobFiles = @()
+foreach ($job in $server.JobServer.Jobs) {
+ $SafeJobName = ($job.Name -replace '[\\/:*?"<>|]', '_')
+ $FileName = Join-Path $BackupPath "$SafeJobName`_$Timestamp.sql"
+ $job.Script() | Out-File -FilePath $FileName -Encoding UTF8
+ $JobFiles += $FileName
+}
+
+# Compress all SQL files into a single ZIP
+Compress-Archive -Path $JobFiles -DestinationPath $ZipFile -Force
+
+# Optional: clean up individual .sql files
+# Remove-Item -Path $JobFiles
+
+Write-Host "SQL Agent jobs backup complete: $ZipFile" -ForegroundColor Green
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/BackupDB.sql b/SqlAgent/03_Prod/6_Backup_Restore/BackupDB.sql
new file mode 100644
index 0000000..dbaf325
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/BackupDB.sql
@@ -0,0 +1,19 @@
+USE master;
+GO
+
+DECLARE @SrcDB NVARCHAR(128) = 'ProdDUTASJobSchedule';
+DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak';
+DECLARE @SQL NVARCHAR(MAX);
+
+-- Dynamic SQL for backup
+SET @SQL = '
+BACKUP DATABASE [' + @SrcDB + ']
+TO DISK = N''' + @BackupPath + '''
+WITH INIT, COMPRESSION, STATS = 10;
+';
+
+-- Execute backup
+EXEC(@SQL);
+
+PRINT 'Backup completed: ' + @BackupPath;
+GO
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/Cleanup-SQLAgent.ps1 b/SqlAgent/03_Prod/6_Backup_Restore/Cleanup-SQLAgent.ps1
new file mode 100644
index 0000000..dc1c4aa
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/Cleanup-SQLAgent.ps1
@@ -0,0 +1,45 @@
+<#
+.SYNOPSIS
+Deletes SQL Agent jobs whose names start with a given environment prefix (e.g., DEVL, TEST, PROD).
+
+.PARAMETER ServerName
+SQL Server instance name (use FCI virtual name if clustered).
+
+.PARAMETER Env
+Environment prefix for job deletion (e.g., DEVL, TEST, PROD).
+
+.EXAMPLE
+.\Cleanup-SQLAgent.ps1 -ServerName "DOES-DUTAS-SQL" -Env "PROD"
+#>
+
+param (
+ [Parameter(Mandatory = $true)]
+ [string]$ServerName,
+
+ [Parameter(Mandatory = $true)]
+ [string]$Environment
+)
+
+# Load SQL Server module
+Import-Module SqlServer -ErrorAction Stop
+
+# Connect to SQL Server
+$server = New-Object Microsoft.SqlServer.Management.Smo.Server $ServerName
+
+# Create log file path (same folder as script)
+$ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$LogPath = Join-Path $ScriptRoot "CleanupSQLAgent_$($Environment)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
+
+"=== SQL Agent Cleanup Started for $Environment : $(Get-Date) ===" | Out-File $LogPath -Encoding UTF8
+
+# Take a snapshot of all jobs first (avoids collection modification issue)
+$jobsToDelete = @($server.JobServer.Jobs | Where-Object { $_.Name -like "$Environment*" })
+
+foreach ($job in $jobsToDelete) {
+ Write-Host "Deleting job: $($job.Name)" -ForegroundColor Yellow
+ "Deleting job: $($job.Name)" | Out-File $LogPath -Append -Encoding UTF8
+ $job.Drop()
+}
+
+"=== Cleanup Complete for $Environment : $(Get-Date) ===" | Out-File $LogPath -Append -Encoding UTF8
+Write-Host "All $Environment SQL Agent jobs deleted successfully." -ForegroundColor Green
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/CleanupSQLAgent.sql b/SqlAgent/03_Prod/6_Backup_Restore/CleanupSQLAgent.sql
new file mode 100644
index 0000000..d25424b
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/CleanupSQLAgent.sql
@@ -0,0 +1,27 @@
+USE msdb;
+GO
+
+DECLARE @EnvPrefix NVARCHAR(50) = N'PROD'; -- <<< Change this to your environment prefix
+DECLARE @job_id UNIQUEIDENTIFIER;
+DECLARE @job_name NVARCHAR(200);
+
+DECLARE JobCursor CURSOR FOR
+SELECT job_id, name
+FROM msdb.dbo.sysjobs
+WHERE name LIKE @EnvPrefix + '%'; -- Only jobs starting with the given prefix
+
+OPEN JobCursor;
+FETCH NEXT FROM JobCursor INTO @job_id, @job_name;
+
+WHILE @@FETCH_STATUS = 0
+BEGIN
+ PRINT 'Deleting job: ' + @job_name;
+ EXEC msdb.dbo.sp_delete_job @job_id = @job_id;
+ FETCH NEXT FROM JobCursor INTO @job_id, @job_name;
+END
+
+CLOSE JobCursor;
+DEALLOCATE JobCursor;
+
+PRINT 'All SQL Agent jobs starting with prefix ' + @EnvPrefix + ' deleted successfully.';
+GO
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/Extract_Backup-SQLAgent.ps1 b/SqlAgent/03_Prod/6_Backup_Restore/Extract_Backup-SQLAgent.ps1
new file mode 100644
index 0000000..d452a56
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/Extract_Backup-SQLAgent.ps1
@@ -0,0 +1,8 @@
+$BackupZip = "\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\SQLAgentJobs_20251018_153000.zip"
+$ExtractPath = "\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Restore\"
+
+# Create folder if not exist
+if (-not (Test-Path $ExtractPath)) { New-Item -ItemType Directory -Path $ExtractPath | Out-Null }
+
+# Extract the ZIP
+Expand-Archive -Path $BackupZip -DestinationPath $ExtractPath -Force
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/RestoreDB.sql b/SqlAgent/03_Prod/6_Backup_Restore/RestoreDB.sql
new file mode 100644
index 0000000..a9f1c12
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/RestoreDB.sql
@@ -0,0 +1,31 @@
+USE master;
+GO
+
+DECLARE @SrcDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; -- original database
+DECLARE @NewDB NVARCHAR(128) = 'ProdDUTASJobSchedule'; -- database name to restore as
+DECLARE @BackupPath NVARCHAR(260) = '\\DOES-RAINVM-PRD\E$\Neeraj\SqlAgent\Backup\' + @SrcDB + '.bak';
+DECLARE @SQL NVARCHAR(MAX);
+
+-- Optional: check logical file names inside backup
+-- RESTORE FILELISTONLY FROM DISK = @BackupPath;
+
+-- Dynamic SQL for restore
+SET @SQL = '
+-- Optional: disconnect active connections
+ALTER DATABASE [' + @NewDB + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
+
+RESTORE DATABASE [' + @NewDB + ']
+FROM DISK = N''' + @BackupPath + '''
+WITH MOVE N''' + @SrcDB + ''' TO N''\\DOES-RAINVM-PRD\E$\SQLData\' + @NewDB + '.mdf'',
+ MOVE N''' + @SrcDB + '_log'' TO N''\\DOES-RAINVM-PRD\E$\SQLLogs\' + @NewDB + '_log.ldf'',
+ REPLACE, STATS = 10;
+
+-- Set database back to multi-user
+ALTER DATABASE [' + @NewDB + '] SET MULTI_USER;
+';
+
+-- Execute restore
+EXEC(@SQL);
+
+PRINT 'Database restored successfully as ' + @NewDB;
+GO
diff --git a/SqlAgent/03_Prod/6_Backup_Restore/RestoreSQLAgent.sql b/SqlAgent/03_Prod/6_Backup_Restore/RestoreSQLAgent.sql
new file mode 100644
index 0000000..1808f8f
--- /dev/null
+++ b/SqlAgent/03_Prod/6_Backup_Restore/RestoreSQLAgent.sql
@@ -0,0 +1,12 @@
+# Connect to SQL Server
+$ServerName = "DOES-DUTAS-SQL"
+$SqlInstance = "localhost" # or server instance name
+
+# Execute each script
+$ScriptFiles = Get-ChildItem -Path $ExtractPath -Filter *.sql
+foreach ($file in $ScriptFiles) {
+ Write-Host "Restoring job from: $($file.FullName)"
+ sqlcmd -S $SqlInstance -i $file.FullName
+}
+
+Write-Host "All SQL Agent jobs restored successfully."
diff --git a/SqlAgent/DUTASJobSchedule_Configuration_Document_v0.1.docx b/SqlAgent/DUTASJobSchedule_Configuration_Document_v0.1.docx
new file mode 100644
index 0000000..d16aaf8
Binary files /dev/null and b/SqlAgent/DUTASJobSchedule_Configuration_Document_v0.1.docx differ
diff --git a/SqlAgent/DUTAS_SQLAgent_Config_v0.2.docx b/SqlAgent/DUTAS_SQLAgent_Config_v0.2.docx
new file mode 100644
index 0000000..5d4a185
Binary files /dev/null and b/SqlAgent/DUTAS_SQLAgent_Config_v0.2.docx differ
diff --git a/SqlAgent/DUTAS_SQLAgent_Config_v0.3.docx b/SqlAgent/DUTAS_SQLAgent_Config_v0.3.docx
new file mode 100644
index 0000000..4b23160
Binary files /dev/null and b/SqlAgent/DUTAS_SQLAgent_Config_v0.3.docx differ