在迁移或升级SQL Server数据库服务器时,不少场景下咱们不能还原msdb,因此咱们必须手工迁移SQL Server相关做业。若是手工生成每个做业的脚本话,费时又费力,其实SQL Server中有好几种方法能够批量生成做业脚本的方法, 下面介绍一下。php
1:SSMS客户端工具批量生成建立做业脚本html
1:在SSMS—>SQL Server Agent下,单击Jobs。sql
2: 按快捷键F7,在Object Explorer Details里面,你会看到全部的做业数据库
3: 全选全部做业(CTRL+A),而后右键单击“Script Job as”,而后选项“CREATE TO"就会生成全部做业的脚本。服务器
这个方法实际上是很是简洁方便的。不足之处就是全部做业的脚本位于同一个Script,没有按做业名生成相关对应的脚本。app
2:使用PowerShell脚本生成全部做业的脚本ide
有一个现成的PowerShell脚本,相关介绍以及脚本下载具体参考下面连接:函数
https://gallery.technet.microsoft.com/scriptcenter/How-to-get-the-of-all-the-81859696工具
PS C:\Users> M:\GetJobScripts\GetAllAgentJobs.ps1测试
cmdlet GetAllAgentJobs.ps1 at command pipeline position 1
Supply values for the following parameters:
ServerName: YourServerName
FilePath: M:\GetJobScripts
Scripting out xxxxxxxxxxxx successfully!
Scripting out xxxxxxxxxxxx successfully!
.........................................
使用该PowerShell脚本能够生成各个做业的各自脚本。很是简洁方便。不过该脚本要求Windows PowerShell 2.0或更高的版本,另外,有些平台是没有测试过的,须要参考上面连接说明。 GetAllAgentJobs.ps1的脚本以下:
<#
The sample scripts are not supported under any Microsoft standard support
program or service. The sample scripts are provided AS IS without warranty
of any kind. Microsoft further disclaims all implied warranties including,
without limitation, any implied warranties of merchantability or of fitness for
a particular purpose. The entire risk arising out of the use or performance of
the sample scripts and documentation remains with you. In no event shall
Microsoft, its authors, or anyone else involved in the creation, production, or
delivery of the scripts be liable for any damages whatsoever (including,
without limitation, damages for loss of business profits, business interruption,
loss of business information, or other pecuniary loss) arising out of the use
of or inability to use the sample scripts or documentation, even if Microsoft
has been advised of the possibility of such damages.
#>
Param(
[Parameter(Mandatory = $true, position = 0)][string] $ServerName,
[Parameter(Mandatory = $true, position = 1)][string] $FilePath
)
if(Test-Path $FilePath)
{
#check if the instance name is available on the server
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") |Out-Null
$srv = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $ServerName
if($ServerName.contains($env:COMPUTERNAME) -and ($srv.VersionString))
{
$jobs = $srv.JobServer.Jobs | Where-Object {$_.category -notlike "*repl*" -and $_.category -notlike "*shipping*" -and $_.category -notlike "*Maintenance*" }
ForEach ( $job in $jobs)
{
$jobname = $FilePath +'\' + $job.Name.replace(" ","_").replace("\","_").replace("[","_").replace("]","_").replace(".","_").replace(":","_").replace("*","_") + ".sql"
$job.Script() | Out-File $jobname
Write-Host 'Scripting out ' $job ' successfully!'
}
}
else
{
Write-Host 'The server name you entered is not available!'
}
}
else
{
Write-Host 'The path does not exist, please retype again!'
}
方法3:经过SqlDmo组件相关函数生成数据库对象脚本,不过有些版本因为没有安装"Backward Compatibility Components" 致使该脚本不能建立相关脚本文件,我的测试时也遇到很多问题,有兴趣能够试试。
http://www.databasejournal.com/features/mssql/article.php/2205291/Generate-Scripts-for-SQL-Server-Objects.htm
参考资料:
https://stackoverflow.com/questions/3361163/automatically-create-scripts-for-all-sql-server-jobs
https://gallery.technet.microsoft.com/scriptcenter/How-to-get-the-of-all-the-81859696