Ho un DB centrale in cui riscrivo i risultati del lavoro su tutti i miei server. Passo 3 parametri tramite PowerShell in un lavoro SQL a uno sp sul server centrale che verifica che il lavoro debba essere in esecuzione in quel momento, ecc. Le informazioni vengono quindi esposte tramite SSRS in modo da poter vedere un fallimento di lavori / lavori di lunga durata / e lavori che non sono stati eseguiti ma dovrebbero avere (o se qualcuno ha sbagliato con una pianificazione).
Per fare questo, ho 2 passaggi di lavoro aggiunti in ogni lavoro su ogni server e vorrei ridurre lo script a solo 1 passaggio aggiunto a ciascun lavoro ... possibilmente anche chiamarlo da una condivisione di rete ..
Ma il mio problema è uno dei 3 parametri che passo. Devo ottenere il jobid in esecuzione o il nome del lavoro all'interno del lavoro in esecuzione, quindi non devo codificare il parametro name. I 3 parametri che passo sono jobid, status (esito positivo / negativo), errormsg. Lo script PowerShell che ho scritto è piuttosto semplice.
Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Success / FAIL', 'BAD MESSAGE HERE'"
Questo scrive ciò di cui ho bisogno sul tavolo. Ho esaminato msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / ma nessuno di questi garantirà che ottengo l'ID o il nome del lavoro in esecuzione corretto nel caso in cui ci siano più di 1 lavori in esecuzione su lo stesso tempo.
Ho anche provato a guardare sys.sysprocesses ma penso che poiché il lavoro dell'agente è uno script PowerShell, viene visualizzato come ".Net SqlClient Data Provider", quindi non riesco a tagliare il JOBID binario dai lavori che mostrano come "SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Step 1) "--- questo l'ho imparato dal post di Denny cherry - grazie denny-
Qualsiasi idea su come afferrare il jobid in esecuzione sarebbe molto apprezzata.
Grazie,
Chris