Abrufen der Job-ID ODER des Jobnamens aus dem ausgeführten Job


12

Ich habe eine zentrale Datenbank, in die ich Jobergebnisse auf allen meinen Servern zurückschreibe. Ich übergebe 3 Parameter über Powershell in einem SQL-Job an einen SP auf dem zentralen Server zurück, der überprüft, ob der Job zu diesem Zeitpunkt ausgeführt werden soll usw. Die Informationen werden dann über SSRS verfügbar gemacht, damit wir einen Jobfehler / Jobs mit langer Laufzeit sehen können. & Jobs, die nicht ausgeführt wurden, aber ausgeführt werden sollten (oder wenn jemand mit einem Zeitplan herumgespielt hat).

Zu diesem Zweck werden jedem Job auf jedem Server 2 Jobschritte hinzugefügt, und ich möchte das Skript auf nur 1 Schritt reduzieren, der jedem Job hinzugefügt wird. Möglicherweise kann ich es sogar von einer Netzwerkfreigabe aus aufrufen.

Aber mein Problem ist einer der 3 Parameter, die ich übergebe. Ich muss die ausführende Job-ID oder den Jobnamen aus dem ausführenden Job abrufen, damit ich den Parameter name nicht fest codieren muss. Die 3 Parameter, die ich übergebe, sind jobid, status (Erfolg / Misserfolg), errormsg. Das Powershell-Skript, das ich geschrieben habe, ist ziemlich einfach.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Datenbank remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Erfolg / FEHLER', 'SCHLECHTE NACHRICHT HIER'"

Dies schreibt, was ich brauche, auf den Tisch. Ich habe mir msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / angesehen, aber keines davon garantiert, dass ich die ID oder den Namen des korrekt ausgeführten Jobs erhalte, falls mehr als 1 Jobs ausgeführt werden die selbe Zeit.

Ich habe sogar versucht, sys.sysprocesses zu betrachten, aber ich denke, da der Agentenjob ein Powershell-Skript ist, wird er als ".Net SqlClient Data Provider" angezeigt, sodass ich die binäre JOBID nicht von den Jobs abschneiden kann, die als "SQLAgent -" angezeigt werden. TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Schritt 1) ​​"--- das habe ich aus Denny Cherry's Post gelernt - danke denny-

Alle Ideen, wie man die ausführende Job-ID ergreift, wären sehr dankbar.

Vielen Dank,

Chris

Antworten:


19

Sie müssen in Ihren Jobschritten Token verwenden, um Ihre eigene Job-ID zu erhalten. Details hier: Verwenden von Tokens in Jobschritten .

Am Ende des Artikels gibt es ein Beispiel mit jobid:

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

Ich habe früher mit den Token gearbeitet, sie aber aufgegeben, weil ich sie nicht dazu bringen konnte, mit Powershell richtig zu arbeiten. Ich debugge jetzt. Vielen Dank an beide.
CleanFill

1

Damit dies funktioniert, habe ich das invoke-sqlcmdCmdlet in Powershell über den SQL-Agenten verwendet. Unter Verwendung der Informationen, die ich oben erhalten habe, funktionierte Folgendes:

$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

Der eine Teil, der mich dazu brachte, war, dass ich diese Zeile hinzufügen musste

$varname = $var.name

Wenn ich dies nicht hinzufügen würde, würde die anfängliche Variable $ var den Header system.data.datatable lange mit dem Spaltennamen des Jobs übergeben, sodass die Variable die Abfrage zur Laufzeit durcheinander bringt.

Hoffe, dies kann jemand anderem auf der Straße helfen.


0

Überprüfen Sie dies:

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.