从正在执行的作业中获取作业ID或作业名称


12

我有一个中央数据库,可以在所有服务器上写入工作结果。我通过SQL作业中的powershell将3个参数传递回中央服务器上的sp,以验证该作业应在当时运行,等等。然后通过SSRS公开该信息,因此我们可以看到作业失败/长时间运行的作业/ &尚未运行但应该运行的作业(或者如果有人弄乱了时间表)。

为此,我将2个作业步骤添加到每台服务器上的每个作业中,并且我希望将脚本减少到仅添加到每个作业中的1个步骤。甚至可能从网络共享中调用该脚本。

但是我的问题是我传递的三个参数之一。我需要从正在执行的作业中获取正在执行的作业ID或作业名称,因此不必硬编码name参数。我传递的3个参数是Jobid,状态(成功/失败)和errormsg。我编写的powershell脚本非常简单。

调用sqlcmd -ServerInstance“ MYRemoteSYSTEM”-数据库remoteDB-查询“ exec dbo.JOB_LOG'JOBNAME / ID','成功/失败','错误消息在这里'''

这将我需要的东西写到桌子上。我已经看过msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs /,但是这些都不保证在执行多个作业的情况下,我可以获得正确执行作业的ID或名称。同时。

我什至尝试查看sys.sysprocesses,但我认为由于代理作业是一个powershell脚本,因此它显示为“ .Net SqlClient数据提供程序”,因此我无法从显示为“ SQLAgent-”的作业中删除二进制JOBID。 TSQL JobStep(作业0xF1800243164745429C30474FFD5C990C:第1步)” ---我从Denny Cherry的帖子中学到 -谢谢denny-

任何关于如何获取执行中的Jobid的想法将不胜感激。

谢谢,

克里斯

Answers:


19

您将必须在工作步骤中使用令牌来获取自己的工作ID。此处的详细信息:在作业步骤中使用令牌

在文章的结尾,有一个带有jobid的示例:

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

我之前使用的是令牌,但由于无法使它们在Powershell中正常工作而放弃了它们。我正在调试。非常感谢你们。
CleanFill 2012年

1

为了invoke-sqlcmd使它起作用,我通过SQL代理在Powershell中使用了cmdlet。使用我上面收到的信息,我想到的是可行的:

$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标头中长时间传递作业的列名,因此它导致变量在运行时使查询混乱。

希望这可以帮助其他人。


0

检查一下:

DECLARE @jobId BINARY(16)

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

-2
DECLARE @jobname sysname, @jobid uniqueidentifier

SELECT @jobname=b.name,@jobid=b.job_id  
FROM sys.dm_exec_sessions a,msdb.dbo.sysjobs b
WHERE a.session_id=@@spid
AND 
(SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(a.PROGRAM_NAME,30,10)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.