我正在编写一个Powershell脚本,它使用本地SQL Server数据库执行多项操作。
我正在做的一件事就是一个接一个地运行几个SQL作业。我像这样运行它们:
sqlcmd -S .\ -Q "EXECUTE msdb.dbo.sp_start_job @job_name = 'Rebuild Content Asset Relationship Data'"
有没有办法让Powershell延迟运行下一个作业,直到完成第一个作业?
由于
答案 0 :(得分:11)
要从PowerShell访问SQL代理作业,您可以使用SMO:
编辑:如果要将此功能添加到脚本中,请考虑效率我会将SMO加载出来并将其放在脚本顶部附近(在此之前)功能)。如果每次调用它重新加载程序集的函数,它可能会减慢你的脚本速度。
Function Get-SQLJobStatus
{
param ([string]$server, [string]$JobName)
# Load SMO assembly, and if we're running SQL 2008 DLLs load the SMOExtended and SQLWMIManagement libraries
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
# Create object to connect to SQL Instance
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $server
# used to allow piping of more than one job name to function
if($JobName)
{
foreach($j in $jobName)
{
$srv.JobServer.Jobs | where {$_.Name -match $JobName} | Select Name, CurrentRunStatus
}
}
else #display all jobs for the instance
{
$srv.JobServer.Jobs | Select Name, CurrentRunStatus
} #end of Get-SQLJobStatus
}
您可以使用此功能的方法示例:
#will display all jobs on the instance
Get-SQLJobStatus MyServer
#pipe in more than one job to get status
"myJob","myJob2" | foreach {Get-SQLJobStatus -Server MyServer -JobName $_}
#get status of one job
Get-SQLJobStatus -Server MyServer -JobName "MyJob"
您可以在脚本中使用此功能,只需在while循环中重复调用它,直到您的作业状态显示为“空闲”。至少在我脑海里,这是我认为可行的方法:)。
答案 1 :(得分:1)
当然,在sqlcmd.exe的调用之间执行Start-Sleep -seconds <nn>
。
答案 2 :(得分:1)
我的建议是将你的工作包装在一个新的工作中,然后通过不断地轮询其状态来等待它完成工作。从attached article开始,您可以执行以下操作:
DECLARE @JobStatus INT
SET @JobStatus = 0
EXEC MSDB.dbo.sp_start_job @Job_Name = 'JobName'
SELECT @JobStatus = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;',
'EXEC MSDB.dbo.sp_help_job @job_name = ''JobName'', @job_aspect = ''JOB'' ')
WHILE @JobStatus <> 4
BEGIN
SELECT @JobStatus = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;',
'EXEC MSDB.dbo.sp_help_job @job_name = ''JobName'', @job_aspect = ''JOB'' ')
END
然后,不是从命令行调用sp_start_job
,而是从命令行调用您的sproc,PowerShell将被阻塞,直到该sproc完成。希望这有帮助!
答案 3 :(得分:0)
您的作业由SQL Server代理执行。您可以直接从PowerShell脚本调用相应的存储过程(或SQL语句),也可以在解释的内容中实现某些内容here.