February 1, 2009 at 6:34 pm
Hi,
I need to automate scripting of all jobs on a SQL 2005/2008 server. I can't use any Integration Services packages, and apparently SCPTXFR.EXE is no longer present in SQL Server 2005.
Just wondering if there is an existing script for this task, so I could put it as a job step?
Thanks.
February 2, 2009 at 7:48 am
In sql server 2005, you can use sql management studio --> select the Job folder in object explore --> select all jobs in object explore details window--> right click and script all the jobs. Some modifications may need if you want to deploy in another computer. Hope it helps.
February 2, 2009 at 3:00 pm
No, this is not what I want. I don't want a manual process, I want automatic. E.g. a job running every night and scripting all the jobs into a text file.
February 3, 2009 at 6:10 am
you can use one of the dot net languages with SMO to script the jobs. This is a snippet from something I did in VB.Net. Please keep in mind that I am not very good with VB. Of course you will need to create all your variable, objects, streamwriter, etc.
There are quite a lot of examples on the net. It's the only way I could do it since I'm not a dot net person.
wf.WriteLine()
wf.WriteLine("-- **** Create Jobs")
wf.WriteLine()
Dim jb As Agent.Job
For Each jb In svr.JobServer.Jobs
smoObjects = New Urn(0) {}
smoObjects(0) = jb.Urn
scrp.Options.IncludeIfNotExists = True
Dim sc As StringCollection
sc = scrp.Script(smoObjects)
Dim st As String
For Each st In sc
wf.WriteLine(st)
wf.Flush()
Next
Next
MG
"There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies."
Tony Hoare
"If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair.
February 3, 2009 at 4:00 pm
I am not good with VB either. In fact I have no knowledge of it at all, because I am not a developer. I was just wondering if there is a TSQL script already developed, so I don't have to develop it myself.
February 4, 2009 at 5:42 am
The snippet is part of a much larger program that scripts out every object in a database so it would be hard to break down.
Maybe someone who is good with Powershell can help. From some of the PS code I've seen, using the PS SQL provider, someone can probably do this as a PS script.
MG
"There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies."
Tony Hoare
"If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair.
March 11, 2009 at 7:20 am
Hello everyone,
I believe this will make everyone happy and there is not coding involved. Just search for SQLScripter. A gentleman has create a neat application to script out everything or just some things including jobs. Just modify the confiig file and execute.
That's it.
Rudy
Rudy
March 11, 2009 at 7:39 am
Rudy Panigas (3/11/2009)
Hello everyone,I believe this will make everyone happy and there is not coding involved. Just search for SQLScripter. A gentleman has create a neat application to script out everything or just some things including jobs. Just modify the confiig file and execute.
That's it.
Rudy
can you provide a URL, search on sqlscripter produced nothing obvious
---------------------------------------------------------------------
March 11, 2009 at 7:56 am
I just Googled it. http://www.sqlscripter.com/
Rudy
March 11, 2009 at 8:22 am
Hi, I use the following as an active x script from a job on SQL 2000:
Dim conServer
Dim fso
Dim iFile
Dim oJB
Dim strJob
Dim strFilename
Const ioModeAppend = 8
Set conServer = CreateObject("SQLDMO.SQLServer")
conServer.LoginSecure = True
conServer.Connect "##Server_Name##"
strFilename = "C:\JOBS.sql"
For Each oJB In conServer.JobServer.Jobs
strJob = strJob & "--------------------------------------------------" & vbCrLf
strJob = strJob & "-- SCRIPTING JOB: " & oJB.Name & vbCrLf
strJob = strJob & "--------------------------------------------------" & vbCrLf
strJob = strJob & oJB.Script() & vbCrLf
Next
Set conServer = Nothing
Set fso = CreateObject("Scripting.FileSystemObject")
Set iFile = fso.CreateTextFile(strFilename, True)
iFile.Write (strJob)
iFile.Close
Set fso = Nothing
March 11, 2009 at 8:28 am
I use VBS for 2000 also but you need to use SMO on 2005/8 and that is what is in the post. One of the Dot Net languages or Powershell can use SMO.
The other option is to try to find something that someone already wrote is willing to share, or purchase something.
MG
"There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies."
Tony Hoare
"If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." Red Adair.
April 11, 2011 at 8:23 pm
Thanks for the script.
It worked for me on SQL Server 2005.
I created a job with this ActiveX script and it was just perfect.
Maybe I will think about changing the script to script jobs into separate files as an option.
December 15, 2011 at 10:25 am
GO
/****** Object: StoredProcedure [dbo].[DBA_DR_Generate_Script_SQL_Agent_Jobs] Script Date: 12/14/2011 13:34:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*Requires this run to turn on feature
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
*/
CREATE PROCEDURE [dbo].[DR_Generate_Script_SQL_Agent_Jobs]
-- Add the parameters for the stored procedure here
@FileName varchar(200), -- File name to script jobs out
@ps1filename Varchar(300) -- File name to create powershell script
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--sp_OA params
DECLARE @cmd varchar(255) -- Command to run
DECLARE @oSQLServer int -- OA return object
DECLARE @hr int -- Return code
-- version parameters
DECLARE @sqlver sql_variant
DECLARE @sqlver2 varchar(20)
DECLARE @sqlver3 int
--User params
DECLARE @server varchar(30) -- Server name to run script on. By default, local server.
Select @server = @@SERVERNAME
--SQL DMO Constants
DECLARE @ScriptType varchar(50)
DECLARE @Script2Type varchar(50)
SET @ScriptType = '327' -- Send output to file, Transact-SQL, script permissions, test for existence, used quoted characters.
SET @Script2Type = '3074' -- Script Jobs, Alerts, and use CodePage 1252.
--Set the following properties for your server
-- Get Verion and GOTO it
SELECT @sqlver = SERVERPROPERTY('productversion')
SELECT @sqlver2 = CAST(@sqlver AS varchar(20))
select @sqlver3 = SUBSTRING(@sqlver2,1,1)
-- 1 = 2008 8 = 2000 and 9 = 2005 1 is short for 10
BEGIN
--select @sqlver3 only uncomment to see state of version
IF @sqlver3 = 1 GOTO SERVER2008
IF @sqlver3 = 9 GOTO SERVER2000
IF @sqlver3 = 8 GOTO SERVER2000
GOTO THEEND
END
SERVER2000:
--insert into file to create categories. will error out for categories that exist but works, bug in 2000
DECLARE @cmd5 sysname, @var sysname
-- truncate file or create file
SET @var = 'echo off > '
SET @cmd5 = @var + @filename
EXEC master..xp_cmdshell @cmd
select @cmd5
-- Append to the file after Truncating
--cursor to Insert rows into @filename
DECLARE @stringname VARCHAR(1000)
DECLARE db_cursor CURSOR FOR
select (
'EXEC msdb.dbo.sp_add_category @name = ' + char (39) + name + char (39) )
from msdb.dbo.syscategories (nolock)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @stringname
WHILE @@FETCH_STATUS = 0
BEGIN
-- insert stringname into @filename
DECLARE @cmd6 VARCHAR(4000)
SET @cmd6 = 'echo' + ' ' + @stringname + ' >> ' + @filename
EXEC master..xp_cmdshell @cmd6
-- end insert stringname into @filename
FETCH NEXT FROM db_cursor INTO @stringname
END
CLOSE db_cursor
DEALLOCATE db_cursor
-- enter one more GO before the job script runs.
SET @cmd6 = 'echo GO >> ' + @filename
EXEC master..xp_cmdshell @cmd6
-- now append to the same file job scripts
--CREATE The SQLDMO Object
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @oSQLServer OUT
--Set Windows Authentication
EXEC @hr = sp_OASetProperty @oSQLServer, 'LoginSecure', TRUE
--Connect to the Server
EXEC @hr = sp_OAMethod @oSQLServer,'Connect',NULL,@server
--Script the job out to a text file
SET @cmd = 'Jobserver.Jobs.Script(' + @ScriptType + ',"' + @FileName +'",' + @Script2Type + ')'
EXEC @hr = sp_OAMethod @oSQLServer, @cmd
--Close the connection to SQL Server
--If object is not disconnected, the processes will be orphaned.
EXEC @hr = sp_OAMethod @oSQLServer, 'Disconnect'
--Destroy object created.
exec sp_OADestroy @oSQLServer
GOTO THEEND
SERVER2008:
declare @sql3 varchar(200)
declare @sql varchar(900)
declare @sql2 varchar(900)
-- set execution policy to allow scripts to be run.
set @sql ='Set-ExecutionPolicy RemoteSigned'
set @sql2 = 'powershell -c "' + @sql + '"'
exec xp_cmdshell @sql2
--start building ps1 file to execute
set @sql ='[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") '
set @sql2 = ' echo ' + @sql + ' > ' + + @ps1filename
exec xp_cmdshell @sql2
set @sql ='$server = New-Object Microsoft.SqlServer.Management.Smo.Server("' + @server + '")'
set @sql2 = ' echo ' + @sql + ' >> ' + + @ps1filename
exec xp_cmdshell @sql2
set @sql ='$scripter = New-Object Microsoft.SqlServer.Management.Smo.Scripter($server)'
set @sql2 = ' echo ' + @sql + ' >> ' + + @ps1filename
exec xp_cmdshell @sql2
set @sql ='$jobs = $server.JobServer.get_Jobs() ' + CHAR(94) + CHAR(124) +' Where-Object {$_.Name -notlike "sys*"} '
set @sql2 = ' echo ' + @sql + ' >> ' + + @ps1filename
exec xp_cmdshell @sql2
set @sql ='$script = ""'
set @sql2 = ' echo ' + @sql + ' >> ' + + @ps1filename
exec xp_cmdshell @sql2
set @sql ='foreach($job in $jobs){ $script += $job.Script() + "GO" ' + CHAR(94) + CHAR(124) + ' Out-File -append ' + @filename + '}'
set @sql2 = ' echo ' + @sql + ' >> ' + + @ps1filename
exec xp_cmdshell @sql2
--execute the ps1 file and create jobs script
set @sql3= 'powershell.exe -file ' + @ps1filename + ''
exec xp_cmdshell @sql3
-- delete the ps1 file when done
set @sql3= 'del ' + @ps1filename + ''
exec xp_cmdshell @sql3
GOTO THEEND
THEEND:
END
December 15, 2011 at 11:06 am
Roust_m (2/2/2009)
No, this is not what I want. I don't want a manual process, I want automatic. E.g. a job running every night and scripting all the jobs into a text file.
we do something similar, we have a cursor which will create and drop the jobs on fly. Not that great way but works. One think you have to keep in mind is that creating/dropping jobs will have save the job history and you will need another way to save that history. Let me know if you want the script and i can send you.
December 20, 2011 at 7:42 am
I have an updated script which works on 2000, 2005 and 2008 as well as 2008R2. It is in the script archive awaiting approval at the momemt. it also works with powershell V1 and V2.
Viewing 15 posts - 1 through 14 (of 14 total)
You must be logged in to reply to this topic. Login to reply