web-dev-qa-db-ja.com

ジョブIDを取得OR実行中のジョブ内からジョブ名

すべてのサーバーでジョブの結果を書き戻す中央DBがあります。 SQLジョブでpowershellを介して3つのパラメーターを中央サーバーのspに渡し、そのときにジョブが実行されていることを確認します。次に、情報がSSRSを介して公開されるため、ジョブの失敗/長時間実行されているジョブ/ &まだ実行されていないはずのジョブ(または誰かがスケジュールを変更した場合)。

これを行うには、すべてのサーバーの各ジョブに2つのジョブステップを追加し、スクリプトを各ジョブに1ステップだけ追加して、ネットワーク共有から呼び出すこともできます。

しかし、私の問題は、渡す3つのパラメーターの1つです。 nameパラメーターをハードコーディングする必要がないように、実行中のジョブIDまたはジョブ名を実行中のジョブから取得する必要があります。私が渡す3つのパラメーターは、jobid、status(success/fail)、errormsgです。私が書いたPowerShellスクリプトは非常に単純です。

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME/ID'、 'Success/FAIL'、 'BAD MESSAGE HERE'"

これにより、必要なものがテーブルに書き込まれます。 msdb.dbo.sp_help_job/msdb.dbo.sp_get_composite_job_info/dbo.xp_sqlagent_enum_jobs /を確認しましたが、実行中のジョブが複数ある場合に、正しい実行ジョブのIDまたは名前を取得できるとは限りません同時に。

私もsys.sysprocessesを調べてみましたが、エージェントジョブはpowershellスクリプトであるため、「。Net SqlClient Data Provider」と表示されるため、「SQLAgent-」と表示されるジョブからバイナリJOBIDをトリミングできません。 TSQL JobStep(Job 0xF1800243164745429C30474FFD5C990C:Step 1) "---これは私から学んだ デニーチェリーの投稿 -ありがとうデニー-

実行中のジョブIDを取得する方法についてのアイデアがあれば、大歓迎です。

おかげで、

クリス

12
CleanFill

独自のジョブIDを取得するには、ジョブステップでトークンを使用する必要があります。詳細はこちら: ジョブステップでのトークンの使用

記事の最後に、jobidの例を1つ示します。

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 
19
Marian

これを機能させるために、私はinvoke-sqlcmd SQLシェルを介したPowershellのコマンドレット。上記で受け取った情報を使用して、私が思いついたこれはうまくいきました:

$var = Invoke-sqlcmd -Server "Server\Instance" -Query "select name from msdb.dbo.sysjobs WHERE job_id = CONVERT(uniqueidentifier, $(ESCAPE_SQUOTE(JOBID)))" -- This gives me the job name at runtime

$varname = $var.name -- here i have to put just the name into a variable

Invoke-sqlcmd -Server "server\instance" -Database "remote database" -Query "exec dbo.JOB_LOG $varname,'JOB STATUS HERE','LOG MESSAGE HERE';" 
--here I pass that to the remote system

私を得た一つの部分は、私はこの行を追加しなければならなかったことでした

$varname = $var.name

これを追加しなかった場合、最初の変数$ varがsystem.data.datatableヘッダーにジョブの列名とともに渡されるため、実行時に変数がクエリを混乱させていました。

これが将来の誰かを助けることを願っています。

1
CleanFill

これをチェックして:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'
0
Gerben Kolkman