J'ai une base de données centrale dans laquelle j'écris les résultats des travaux sur tous mes serveurs. Je transmets 3 paramètres via PowerShell dans un travail SQL à un SP sur le serveur central qui vérifie que le travail doit être en cours d'exécution à ce moment-là, etc. 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 le jobid en cours d'exécution ou le nom du job à l'intérieur du job en cours d'exécution, je n'ai donc pas à coder en dur le paramètre name. 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 consulté msdb.dbo.sp_help_job/msdb.dbo.sp_get_composite_job_info/dbo.xp_sqlagent_enum_jobs/mais aucun de ces éléments ne garantit que j'obtiendrai 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) "--- ce que j'ai appris de Message de Denny cherry - merci denny-
Toutes les idées sur la façon de saisir le jobid en cours d'exécution seraient grandement appréciées.
Merci,
Chris
Vous devrez utiliser des jetons dans vos étapes de travail pour obtenir votre propre identifiant de travail. Détails ici: tilisation 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))) ;
Pour que cela fonctionne, j'utilisais le invoke-sqlcmd
applet de commande 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, donc cela 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.
Vérifiez ça:
DECLARE @jobId BINARY(16)
SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'