2009-03-23 6 views
0

Je ne pense pas que quelqu'un sache si un travail d'Agent SQL Server peut demander des informations sur lui-même, comme son propre ID, ou le chemin à partir duquel il s'exécute? Je suis au courant de xp_sqlagent_enum_jobs et sp_help_job mais cela n'aide pas, car vous devez spécifier l'ID du travail. L'idée est que nous voulons un code que nous n'avons pas à gérer en étant capable d'appeler un sproc qui va identifier le travail en cours. Des idées?SQL Server Agent - Le travail peut-il demander des informations sur lui-même

Répondre

4

Oui, mais ce n'est pas joli.

Regardez les processus sys.sys (ou dbo.sys dans SQL 2000 et ci-dessous). Le nom du programme sera quelque chose SQL Agent avec une valeur binaire à la fin. Cette valeur binaire est la valeur binaire du guid du travail. Donc, soustrayez cette valeur et effectuez une recherche sur la table msdb.dbo.sysjobs pour savoir de quel travail il s'agit (vous devrez convertir sysjobs.job_id en varbinary (100) pour que les valeurs correspondent). Je vous ai dit que ce n'était pas joli, mais ça marchera.

+0

Eh bien, il est utile de savoir. Je vais suivre cela, j'ai couru une requête rapide et c'était assez facile à montrer. Je ne suis toujours pas capable de voir comment l'Agent SQL Server pourrait interroger un travail à propos de _itself_. Le planificateur démarrerait et un travail serait en cours, mais comment pourrait-il se demander? – Kezzer

+0

Il n'y a aucun moyen de le savoir par soi-même, car il n'y a pas de fonction qui vous dira quel travail vous exécutez. Comme je l'ai mentionné ci-dessus, vous pouvez prendre le spid courant sous lequel le travail s'exécute, l'utiliser pour trouver la valeur binaire du nom de l'application, puis l'utiliser pour trouver le jobid correct de la table sysjobs. Cela vous permettrait ensuite d'interroger les tables d'historique des travaux pour trouver des informations sur le travail en cours. Vous pouvez même écrire une fonction pour gérer le travail de chaîne et renvoyer le jobid comme une fonction système si elle existait. – mrdenny

0

méchant !!! mais je pense que cela pourrait fonctionner ...

par exemple. utilisé au sein de un travail - select * from msdb..sysjobs where job_id = dbo.fn_currentJobId()

faites-moi savoir.

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 

merci pour l'info que

Questions connexes