SQL Server代理 - 作业可以询问有关自己的信息

时间:2009-03-23 10:23:21

标签: sql-server-2008

我不认为有人知道SQL Server代理作业是否可以询问有关自身的信息,例如它自己的ID,或者它正在运行的路径?我知道xp_sqlagent_enum_jobssp_help_job,但这没有用,因为您必须指定作业ID。

我们的想法是,我们需要通过调用可识别当前作业的sproc来管理我们无需管理的代码。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

是的,但它并不漂亮。

查看sys.sysprocesses(或SQL 2000及以下版本中的dbo.sysprocesses)。程序名称将是SQL Agent,最后是二进制值。该二进制值是作业guid的二进制值。因此,对该值进行子字符串输出并对msdb.dbo.sysjobs表进行查找以找出它的作用(您需要将sysjobs.job_id强制转换为varbinary(100)以获取要匹配的值)。 / p>

我告诉过你它不漂亮,但它会起作用。

答案 1 :(得分:0)

讨厌!但我认为它可能有用......

例如。在作业中使用 - select * from msdb..sysjobs where job_id = dbo.fn_currentJobId()

请告诉我。

create function dbo.fn_CurrentJobId()  
returns uniqueidentifier  
as  
begin  
 declare @jobId uniqueidentifier  

 select @jobId = j.job_id  
 from master..sysprocesses s (nolock)   
 join msdb..sysjobs j (nolock)  
   on (j.job_id = SUBSTRING(s.program_name,38,2) + SUBSTRING(s.program_name,36,2) + SUBSTRING(s.program_name,34,2) + SUBSTRING(s.program_name,32,2) + '-' + SUBSTRING(s.program_name,42,2) + SUBSTRING(s.program_name,40,2) + '-' + SUBSTRING(s.program_name,46,2) + SUBSTRING(s.program_name,44,2) + '-' + SUBSTRING(s.program_name,48,4) + '-' + SUBSTRING(s.program_name,52,12) )
 where s.spid = @@spid  

 return @jobId  
end  
go

感谢您提供的信息