Ottieni ID lavoro O Nome lavoro dall'interno del lavoro in esecuzione


12

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

Risposte:


19

Dovrai usare i token nelle tue fasi di lavoro per ottenere il tuo ID di lavoro. Dettagli qui: Utilizzo dei token in Fasi lavoro .

Alla fine dell'articolo c'è un esempio con jobid:

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 

Prima stavo lavorando con i token, ma li ho abbandonati perché non riuscivo a farli funzionare correttamente con PowerShell. Sto eseguendo il debug ora. Grazie mille ad entrambi.
CleanFill

1

Per farlo funzionare, stavo usando il invoke-sqlcmdcmdlet in PowerShell tramite l'agente sql. Utilizzando le informazioni che ho ricevuto sopra, questo è quello che mi è venuto in mente che ha funzionato:

$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

L'unica parte che mi ha fatto è stata che ho dovuto aggiungere questa linea

$varname = $var.name

perché se non lo aggiungessi, la variabile iniziale $ var passerebbe nell'intestazione system.data.datatable a lungo con il nome della colonna del lavoro, quindi causava il malfunzionamento della variabile durante l'esecuzione.

Spero che questo possa aiutare qualcun altro lungo la strada.


0

Verificare questo:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'

-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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.