2

ローカル SQL Server データベースでいくつかのことを行う Powershell スクリプトを作成しています。

私が行っていることの 1 つは、複数の SQL ジョブを次々に実行することです。私は次のように実行します:

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

最初のジョブが完了するまで、Powershell で次のジョブの実行を遅らせる方法はありますか?

ありがとう

4

4 に答える 4

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 ループなどで繰り返し呼び出すことができます。少なくとも私の頭の中では、それがうまくいくと思います:)

于 2012-04-17T19:33:14.470 に答える
1

私の提案は、ジョブを開始し、ステータスを継続的にポーリングして終了するのを待つ新しい sproc でジョブをラップすることです。添付の記事から、次のようなことができます。

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 を呼び出すと、その sproc が完了するまで PowerShell がブロックされます。お役に立てれば!

于 2012-04-17T18:00:33.763 に答える
1

もちろん、Start-Sleep -seconds <nn>sqlcmd.exe の呼び出しの間に実行してください。

于 2012-04-17T17:18:50.757 に答える
0

ジョブは SQL Server エージェントによって実行されます。対応するストアド プロシージャ (または SQL ステートメント) を PowerShell スクリプトから直接呼び出すか、ここで説明されている行に何かを実装します。

于 2012-04-17T18:03:50.370 に答える