Obtenir l'ID du travail OU le nom du travail à partir du travail en cours d'exécution

12

J'ai une base de données centrale dans laquelle j'écris les résultats des travaux sur tous mes serveurs. Je passe 3 paramètres via PowerShell dans un travail SQL à un SP sur le serveur central qui vérifie que le travail doit être exécuté à ce moment-là, etc. Les informations sont ensuite exposées via SSRS afin que nous puissions voir un échec de travail / des travaux de longue durée et les travaux qui n'ont pas été exécutés mais qui auraient dû (ou si quelqu'un a respecté un calendrier).

Pour ce faire, j'ai 2 étapes de travail ajoutées à chaque travail sur chaque serveur et je voudrais réduire le script à seulement 1 étape ajoutée à chaque travail .. peut-être même l'appeler à partir d'un partage réseau ..

Mais mon problème est l'un des 3 paramètres que je passe. J'ai besoin d'obtenir l'ID de travail ou le nom de travail en cours d'exécution dans le travail en cours d'exécution, je n'ai donc pas à coder en dur le paramètre de nom. Les 3 paramètres que je transmets sont jobid, status (succès / échec), errormsg. Le script PowerShell que j'ai écrit est assez simple.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Success / FAIL', 'BAD MESSAGE HERE'"

Cela écrit ce dont j'ai besoin sur la table. J'ai regardé msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / mais aucun de ceux-ci ne garantira que j'obtiens l'ID ou le nom du travail d'exécution correct dans le cas où plus d'un travail s'exécuterait sur le même temps.

J'ai même essayé de regarder sys.sysprocesses mais je pense que puisque le travail d'agent est un script PowerShell, il apparaît comme ".Net SqlClient Data Provider" donc je ne peux pas couper le JOBID binaire des travaux qui apparaissent comme "SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Étape 1) "--- cela, j'ai appris du message de Denny cherry - merci denny-

Toute idée sur la façon de saisir le jobid en cours d'exécution serait grandement appréciée.

Merci,

Chris

CleanFill
la source

Réponses:

19

Vous devrez utiliser des jetons dans vos étapes de travail pour obtenir votre propre identifiant de travail. Détails ici: Utilisation de jetons dans les étapes de travail .

À la fin de l'article, il y a un exemple avec jobid:

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 
Marian
la source
Je travaillais avec les jetons plus tôt, mais je les ai abandonnés parce que je ne pouvais pas les faire fonctionner correctement avec PowerShell. Je débogue maintenant. Merci beaucoup à vous deux.
CleanFill
1

Pour que cela fonctionne, j'utilisais la invoke-sqlcmdcmdlet dans powershell via l' agent sql. En utilisant les informations que j'ai reçues ci-dessus, voici ce que j'ai trouvé qui a fonctionné:

$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

La seule chose qui m'a eu, c'est que j'ai dû ajouter cette ligne

$varname = $var.name

car si je ne l'ajoutais pas, la variable initiale $ var passerait longtemps dans l'en-tête system.data.datatable avec le nom de la colonne du travail, ce qui faisait que la variable gâchait la requête au moment de l'exécution.

J'espère que cela peut aider quelqu'un d'autre sur la route.

CleanFill
la source
0

Vérifiez ça:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'
Gerben Kolkman
la source
-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)
Virendra Agrawal
la source