it-swarm.it

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

Ho un DB centrale in cui scrivo 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.

Richiama-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 garantisce 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 da post di Denny cherry - grazie denny-

Qualsiasi idea su come afferrare il jobid in esecuzione sarebbe molto apprezzata.

Grazie,

Chris

12
CleanFill

Dovrai usare i token nelle tue fasi di lavoro per ottenere il tuo ID di lavoro. Dettagli qui: tilizzo dei token nelle fasi del lavoro .

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

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

Per farlo funzionare, stavo usando il invoke-sqlcmd cmdlet 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.

1
CleanFill

Verificare questo:

DECLARE @jobId BINARY(16)

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