我有一个中央数据库,我将所有服务器上的工作结果写回。我通过 SQL 作业中的 powershell 将 3 个参数传递回中央服务器上的 sp,以验证作业当时应该正在运行,等等。然后通过 SSRS 公开信息,因此我们可以看到作业失败/长时间运行的作业/ & 尚未运行但应该运行的作业(或者如果有人弄乱了日程安排)。
为此,我在每台服务器上的每个作业中添加了 2 个作业步骤,我想将脚本减少到每个作业仅添加 1 个步骤..甚至可能从网络共享中调用它..
但我的问题是我传递的 3 个参数之一。我需要从正在执行的作业中获取正在执行的作业 ID 或作业名称,因此我不必对名称参数进行硬编码。我传递的 3 个参数是 jobid、status(success/fail)、errormsg。我编写的 powershell 脚本非常简单。
调用-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 的想法都将不胜感激。
谢谢,
克里斯
您必须在工作步骤中使用令牌来获取自己的工作 ID。此处的详细信息:在作业步骤中使用标记。
在文章的最后有一个 jobid 的例子:
为了让它工作,我通过
invoke-sqlcmd
sql 代理在 powershell 中使用 cmdlet。使用我上面收到的信息,这是我想出的有效的方法:让我感动的一个部分是我必须添加这一行
因为如果我没有添加这个,初始变量 $var 将传入 system.data.datatable 标题,并带有作业的列名,因此它会导致变量在运行时弄乱查询。
希望这可以帮助其他人。
检查这个: