it-swarm.com.de

Job-ID abrufen OR Jobname aus dem ausgeführten Job

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/lang laufende Jobs/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 gelernt aus Denny Cherry's Post - danke denny-

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

Vielen Dank,

Chris

12
CleanFill

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

Am Ende des Artikels gibt es ein Beispiel mit jobid:

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

Um dies zum Laufen zu bringen, habe ich das invoke-sqlcmd Cmdlet in Powershell durch den SQL-Agenten. 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.

1
CleanFill

Überprüfen Sie dies:

DECLARE @jobId BINARY(16)

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