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
la source
Pour que cela fonctionne, j'utilisais la
invoke-sqlcmd
cmdlet 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é:La seule chose qui m'a eu, c'est que j'ai dû ajouter cette ligne
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.
la source
Vérifiez ça:
la source
la source