我不认为有人知道SQL Server代理作业是否可以询问有关自身的信息,例如它自己的ID,或者它正在运行的路径?我知道xp_sqlagent_enum_jobs
和sp_help_job
,但这没有用,因为您必须指定作业ID。
我们的想法是,我们需要通过调用可识别当前作业的sproc来管理我们无需管理的代码。有什么想法吗?
答案 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
感谢您提供的信息