![自动从 mssql 服务器导出作业和存储过程](https://linux22.com/image/656574/%E8%87%AA%E5%8A%A8%E4%BB%8E%20mssql%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AF%BC%E5%87%BA%E4%BD%9C%E4%B8%9A%E5%92%8C%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B.png)
我有 MS SQL 服务器,里面有多个作业。有时我和我的同事会更换任务。我想导出作业,比如 自动导出,这样就可以放入 mercurial 并存储作业版本。我也希望在数据库中有类似的存储过程
答案1
一旦您意识到 SSMS 使用 SMO(服务器管理对象)来编写脚本,并且您可以直接通过 powershell 之类的工具自行使用 SMO,这类事情就会变得容易。例如,下面是编写服务器上所有作业的脚本(用 powershell 编写):
pushd;
import-module sqlps -disablenamechecking;
popd;
$s = new-object microsoft.sqlserver.management.smo.server 'yourServer';
$db = $s.Databases['yourDatabase'];
foreach ($proc in $db.StoredProcedures | where {$_.IsSystemObject -eq $false}) {
$proc.script();
}
$a = $s.JobServer;
foreach ($job in $a.Jobs) {
$job.script();
}
这是最不花哨的版本,因为它会直接将其转储到您的屏幕上。想要更花哨的版本吗?创建一个脚本选项对象并将其传递给script()
方法。这应该可以帮助您入门。
答案2
在我的例子中,这个例子没有错误,感谢 Ben Thul:
import-module sqlps -disablenamechecking;
$jobs = Get-ChildItem sql\ServerName\default\jobserver\jobs
foreach ($job in $jobs) {
Write-host $job.Name #script();
$job.script()|out-file c:\out\jobs\$job.sql UTF8
}
import-module sqlps -disablenamechecking;
$StoredProcedures = Get-ChildItem sql\ServerName\default\Databases\DatabaseName\StoredProcedures
foreach ($sp in $StoredProcedures) {
$spname=$sp.Schema+"."+$sp.Name
Write-host $sp.Name #script();
$sp.script()|out-file c:\out\sp\$spname.sql UTF8
}