USE [msdb]; GO SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO CREATE OR ALTER PROCEDURE [dbo].[usp_CreateSQLAgentJob] ( @JobName VARCHAR(100), -- e.g. 'DEVL_DAILY_DTSBX215' @Env CHAR(4) -- 'DEVL' | 'TEST' | 'PROD' ) AS BEGIN SET NOCOUNT ON; DECLARE @ReturnCode INT = 0, @jobId UNIQUEIDENTIFIER, @categoryName NVARCHAR(128), @dbName NVARCHAR(128), @scriptPath NVARCHAR(4000), @step1Cmd NVARCHAR(MAX), @step2Cmd NVARCHAR(MAX), @step3Cmd NVARCHAR(MAX), @SafeJobName SYSNAME, @step2Name NVARCHAR(128), @step3Name NVARCHAR(128); -- Basic validation IF @JobName IS NULL OR LTRIM(RTRIM(@JobName)) = '' BEGIN RAISERROR('JobName is required.', 16, 1); RETURN; END IF @Env NOT IN ('DEVL','TEST','PROD') BEGIN RAISERROR('Env must be one of: DEVL, TEST, PROD.', 16, 1); RETURN; END -- Job category based only on environment SET @categoryName = @Env; -- Map environment to the actual DB name SET @dbName = CASE @Env WHEN 'DEVL' THEN 'DevlDUTASJobSchedule' WHEN 'TEST' THEN 'TestDUTASJobSchedule' WHEN 'PROD' THEN 'ProdDUTASJobSchedule' END; -- Map environment to script path SET @scriptPath = CASE @Env WHEN 'DEVL' THEN '\\DOES-RAINVM-DEV\E$\PSScript\Execute-RemoteJob.ps1' WHEN 'TEST' THEN '\\DOES-RAINVM-TST\E$\PSScript\Execute-RemoteJob.ps1' WHEN 'PROD' THEN '\\DOES-RAINVM-PRD\E$\PSScript\Execute-RemoteJob.ps1' END; -- Safe job name SET @SafeJobName = REPLACE(@JobName, '''', ''''''); -- Step names SET @step2Name = N'Run ' + @JobName; SET @step3Name = N'Update Execution Status'; -- Build step commands SET @step1Cmd = N'EXEC dbo.usp_CheckJobConditions_Generic ''' + @SafeJobName + N''';'; SET @step2Cmd = N'powershell.exe -ExecutionPolicy Bypass -File "' + @scriptPath + N'" -JobName "' + @SafeJobName + N'" -Env "' + @Env + N'"'; SET @step3Cmd = N'DECLARE @ExitCode INT; DECLARE @Today DATE = CAST(GETDATE() AS DATE); SELECT TOP 1 @ExitCode = ExitCode FROM dbo.JobExitCodes WHERE JobName = ''' + @SafeJobName + N''' AND RunDate = @Today ORDER BY RecordedTime DESC; SET @ExitCode = ISNULL(@ExitCode, 1); PRINT ''Using exit code: '' + CAST(@ExitCode AS VARCHAR(10)); EXEC dbo.usp_UpdateJobStatus_Generic ''' + @SafeJobName + N''', @ExitCode;'; BEGIN TRY BEGIN TRANSACTION; -- Ensure category exists IF NOT EXISTS ( SELECT 1 FROM msdb.dbo.syscategories WHERE name = @categoryName AND category_class = 1 ) BEGIN EXEC msdb.dbo.sp_add_category @class = N'JOB', @type = N'LOCAL', @name = @categoryName; END -- Create job EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name = @JobName, @enabled = 1, @notify_level_eventlog = 2, @description = N'Auto-generated DUTAS job.', @category_name = @categoryName, @owner_login_name = N'DOES\DUTASSQLADMINP', @job_id = @jobId OUTPUT; IF @ReturnCode <> 0 RAISERROR('sp_add_job failed with code %d', 16, 1, @ReturnCode); -- Step 1: Check Conditions (T-SQL) EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @jobId, @step_name = N'Check Conditions', @subsystem = N'TSQL', @command = @step1Cmd, @database_name = @dbName, @on_success_action = 3, -- go to next step @on_fail_action = 2; -- quit job reporting failure IF @ReturnCode <> 0 RAISERROR('sp_add_jobstep (step1) failed with code %d', 16, 1, @ReturnCode); -- Step 2: Run PowerShell (CmdExec) EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobId, @step_name = @step2Name, @subsystem = N'CmdExec', @command = @step2Cmd, @on_success_action = 3, -- proceed to next step @on_fail_action = 3; -- proceed to Step 3 IF @ReturnCode <> 0 RAISERROR('sp_add_jobstep (step2) failed with code %d', 16, 1, @ReturnCode); -- Step 3: Update Execution Status (T-SQL) EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobId, @step_name = @step3Name, @subsystem = N'TSQL', @command = @step3Cmd, @database_name = @dbName, @on_success_action = 1, -- quit with success @on_fail_action = 2; -- quit with failure IF @ReturnCode <> 0 RAISERROR('sp_add_jobstep (step3) failed with code %d', 16, 1, @ReturnCode); -- Set the job to start at step 1 EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1; IF @ReturnCode <> 0 RAISERROR('sp_update_job failed with code %d', 16, 1, @ReturnCode); -- Attach job to local server EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'; IF @ReturnCode <> 0 RAISERROR('sp_add_jobserver failed with code %d', 16, 1, @ReturnCode); COMMIT TRANSACTION; PRINT 'Job [' + @JobName + '] created successfully under category [' + @categoryName + '].'; PRINT 'Job contains 3 steps: Check Conditions, Run PowerShell, Update Execution Status.'; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE(); DECLARE @ErrNum INT = ERROR_NUMBER(); RAISERROR('Job creation failed. Msg=%s Num=%d', 16, 1, @ErrMsg, @ErrNum); RETURN; END CATCH END; GO