2012-04-17 16 views
2

ローカルのSQL Serverデータベースでいくつかのことを行うPowershellスクリプトを作成しています。PowershellはSQLジョブを実行し、遅延して次のコマンドを実行します。

私がやっていることは、いくつかのSQLジョブを順番に実行していることです。私は次のように実行します:

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

おかげ

+0

何秒もの遅延を意味しますか?あるいは、 'sqlcmd'はsprocが終了するまで待たないでしょうか? –

+0

マイク:待つことはありません。コマンドを実行すると、0.001秒後にこれが返されます。 'ジョブ 'コンテンツ資産リビジョンデータの再構築が正常に開始しました。' – user952342

+0

クエリが技術的に完了すると、SQL Serverでバックグラウンド処理が開始されます。質問は、PowershellがどのようなSQL Serverのプロセスが終了したかを世界がどのように知っているのだろうか?おそらくx秒ごとにポーリングして、まだ完了しているかどうかを確認できますか? –

答えて

9

のPowerShellからSQLエージェントジョブへのアクセスを取得するには、使用することができます説明:

編集この機能をスクリプトに追加する場合は、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 – deutschZuid

+0

それはうまくいくようですが、私は常にすべての仕事のために "アイドル"になっています。元の投稿の行を使ってpowershellからジョブを実行した場合、または「Microsoft SQL Server管理スタジオ」からジョブを実行しても、すべてのジョブに対して「アイドル」が表示されます。何をすべきかわからない。 サーバーを「./」に設定してください。 私は仕事の種類を知っています。存在しない仕事のステータスを要求すれば、私に何も与えません。 どのような考えですか? – user952342

+0

そのため、ジョブを起動して機能を使用してステータスを確認するように呼び出すのですか?あなたが仕事の歴史を見れば、仕事はどれくらいの期間実行されましたか?唯一役立つのは、最終実行日が現時点よりも大きいかどうかをチェックすることです。私はそれがあなたの状況で動作するかどうかは分かりません。 –

1

確かに、sqlcmd.exeの呼び出し間Start-Sleep -seconds <nn>を実行します。

+0

申し訳ありませんが、私は睡眠を使用しないことをお勧めしたいと思います。これらのジョブの中には実行に5分かかるものもあります。この時間は、マシンの速度によって大きく異なります。 – user952342

1

私の提案は、ジョブを開始する新しいsprocにジョブをラップして、ステータスを継続的にポーリングすることで終了するのを待つことです。 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を終了するまでブロックされます。お役に立てれば!

0

ジョブはSQL Serverエージェントによって実行されます。どちらのSMOを、あなたのPowerShellスクリプトから直接対応するストアドプロシージャ(またはSQL文)を呼び出し、またはあなたは何であるかのラインで何かを実装here.

関連する問題