我有一个中央数据库,我将所有服务器上的作业结果写回。我通过 SQL 作业中的 powershell 将 3 个参数传递回中央服务器上的 sp 验证作业应该在当时运行等。然后通过 SSRS 公开信息,以便我们可以看到作业失败/长时间运行的作业/ & 尚未运行但应该运行的作业(或者如果有人搞砸了时间表)。
为此,我在每台服务器上的每个作业中添加了 2 个作业步骤,并且我想将脚本减少到每个作业中仅添加 1 个步骤……甚至可能从网络共享中调用它。
但我的问题是我传递的 3 个参数之一。我需要从正在执行的作业中获取正在执行的作业 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 / 但这些都不能保证在有超过 1 个作业在执行的情况下我得到正确执行作业的 ID 或名称同时。
我什至尝试查看 sys.sysprocesses,但我认为由于代理作业是一个 powershell 脚本,它显示为“.Net SqlClient 数据提供程序”,因此我无法从显示为“SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C : Step 1)”---这是我从Denny Cherry 的帖子中学到的- 谢谢 Denny-
任何关于如何获取正在执行的 jobid 的想法将不胜感激。
谢谢,
克里斯