すべてのサーバーでジョブの結果を書き戻す中央DBがあります。SQLジョブでpowershellを介して3つのパラメーターを中央サーバーのspに戻し、ジョブがその時点で実行されていることを確認します。次に、情報がSSRSを介して公開されるため、ジョブの失敗/長時間実行されているジョブ/ &まだ実行されていないはずのジョブ(または誰かがスケジュールをめちゃくちゃにした場合)。
これを行うには、すべてのサーバーの各ジョブに2つのジョブステップを追加します。スクリプトを各ジョブに1ステップだけ追加して、ネットワーク共有から呼び出すこともできます。
しかし、私の問題は、渡す3つのパラメーターの1つです。実行中のジョブ内から実行中のジョブIDまたはジョブ名を取得する必要があるので、nameパラメーターをハードコーディングする必要はありません。私が渡す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を取得する方法についてのアイデアは、大歓迎です。
おかげで、
クリス