Copy all jobs, job steps and job schedules

,

This vbscript will generate the sql to recreate all the jobs running on a given SQL server. I wrote this because the last time we migrated a SQL server, I ended up re-creating all the jobs, steps and schedules by hand using the Enterprise Manager. It was the slowest, dullest and most error-prone part of the migration. Being a lazy programmer (aren't all good programmers lazy?) and being in love with scripting languages (especially Perl and VBScript) I thought I would throw a quick little script together to do the job.

So, set up a udl and capture the output to a text file. Paste the sql statements into the query analyzer and voila!

You could easily use a connection object to execute the sql as it ran, or save it to a file and then call osql through a command shell, but I chose not to do that since our migration will be stressful enough without worrying that something went wrong with the script. I'd rather see the SQL and paste it into the query analyzer prior to executing the SQL.

Option Explicit

Dim cn
Dim rsJobs, rsJobSteps, rsJobSchedule
Dim sSQL  
Dim sAppPath
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1


WScript.Echo "Beginning Now : " & Now


sAppPath = getScriptPath()
sSQL = "exec sp_help_job"





'-- Connect to Database
Set cn = CreateObject("ADODB.Connection")
cn.Open "File Name=" & sAppPath & "connect.UDL"


'-- Open Table
Set rsJobs = CreateObject("ADODB.Recordset")
Set rsJobSteps = CreateObject("ADODB.Recordset")
Set rsJobSchedule = CreateObject("ADODB.Recordset")
rsJobs.Open sSQL, cn , adOpenForwardOnly, adLockReadOnly
	
Do While Not rsJobs.EOF
	WScript.echo "/***" & rsJobs("name") & "***/"
	wscript.echo "exec sp_add_job @job_name = '" & ScrubString(rsJobs("name")) & "', @enabled = '" & rsJobs("enabled") & "', @description = '" & ScrubString(rsJobs("description")) & "', @start_step_id = '" & rsJobs("start_step_id") & "', @owner_login_name = '" & rsJobs("owner") & "', @notify_level_eventlog = '" & rsJobs("notify_level_eventlog") & "', @delete_level = '" & rsJobs("delete_level") & "'"
	WScript.Echo vbtab & "/***Steps***/"
	sSQL = "exec sp_help_jobstep @job_id = '" & rsJobs("job_id") & "'"
	rsJobSteps.Open sSQL, cn , adOpenForwardOnly, adLockReadOnly
	Do While Not rsJobSteps.EOF
		Wscript.echo "exec sp_add_jobstep @job_name = '" & ScrubString(rsJobs("name")) & "', @step_id = '" & rsJobSteps("step_id") & "', @step_name = '" & ScrubString(rsJobSteps("step_name")) & "', @subsystem = '" & rsJobSteps("subsystem") & "', @command = '" & ScrubString(rsJobSteps("command")) & "', @flags = '" & rsJobSteps("flags") & "', @cmdexec_success_code = '" & rsJobSteps("cmdexec_success_code") & "', @on_success_action = '" & rsJobSteps("on_success_action") & "', @on_success_step_id = '" & rsJobSteps("on_success_step_id") & "', @on_fail_action = '" & rsJobSteps("on_fail_action") & "', @on_fail_step_id = '" & rsJobSteps("on_fail_step_id") & "', @database_name = '" & rsJobSteps("database_name") & "', @database_user_name = '" & rsJobSteps("database_user_name") & "', @retry_attempts = '" & rsJobSteps("retry_attempts") & "', @retry_interval = '" & rsJobSteps("retry_interval") & "', @output_file_name = '" & rsJobSteps("output_file_name") & "'"
		rsJobSteps.MoveNext
	Loop
	rsJobSteps.Close
	WScript.Echo vbtab & "/***Schedule***/"
	sSQL = "exec sp_help_jobschedule  @job_id = '" & rsJobs("job_id") & "'"
	rsJobSchedule.Open sSQL, cn , adOpenForwardOnly, adLockReadOnly
	Do While Not rsJobSChedule.EOF
		WScript.Echo "exec sp_add_jobschedule @job_name = '" & ScrubString(rsJobs("name")) & "', @name = '" & ScrubString(rsJobSchedule("schedule_name")) & "', @enabled = '" & rsJobSchedule("enabled") & "', @freq_type = '" & rsJobSchedule("freq_type") & "', @freq_interval = '" & rsJobSchedule("freq_interval") & "', @freq_subday_type = '" & rsJobSchedule("freq_subday_type") & "', @freq_subday_interval = '" & rsJobSchedule("freq_subday_interval") & "', @freq_relative_interval = '" & rsJobSchedule("freq_relative_interval") & "', @freq_recurrence_factor = '" & rsJobSchedule("freq_recurrence_factor") & "', @active_start_time = '" & rsJobSchedule("active_start_time") & "'"
		rsJobSchedule.MoveNext
	Loop
	rsJobSchedule.Close
	
	
	rsJobs.MoveNext
Loop
	
rsJobs.Close
cn.Close

Set rsJobs = nothing
Set rsJobSteps = nothing
Set rsJobSchedule= Nothing
Set cn = nothing



Wscript.Echo sData



WScript.Echo "Ending Now : " & Now

function ScrubString (sInStr)
	ScrubString = replace (sInStr,"'","''")
End Function

public function getScriptPath()
dim s
   s = WScript.ScriptFullName
   s = left(s, InStrRev(s, "\" , -1))
   getScriptPath = s
end function

Rate

Share

Share

Rate