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

use*_*342 2 sql-server powershell

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

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

 sqlcmd -S .\ -Q "EXECUTE msdb.dbo.sp_start_job @job_name = 'Rebuild Content Asset Relationship Data'"
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Sha*_*ton 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
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此功能的方法示例:


#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"
Run Code Online (Sandbox Code Playgroud)

您可以在脚本中使用此功能,只需在while循环或其他内容中重复调用它,直到您的作业状态显示为"空闲".至少在我的脑海里,这是我认为可行的:)