Powershell运行SQL作业,延迟,然后运行下一个

时间:2012-04-17 17:06:21

标签: sql-server powershell

我正在编写一个Powershell脚本,它使用本地SQL Server数据库执行多项操作。

我正在做的一件事就是一个接一个地运行几个SQL作业。我像这样运行它们:

 sqlcmd -S .\ -Q "EXECUTE msdb.dbo.sp_start_job @job_name = 'Rebuild Content Asset Relationship Data'"

有没有办法让Powershell延迟运行下一个作业,直到完成第一个作业?

由于

4 个答案:

答案 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.