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
quelle
Damit dies funktioniert, habe ich das
invoke-sqlcmd
Cmdlet in Powershell über den SQL-Agenten verwendet. Unter Verwendung der Informationen, die ich oben erhalten habe, funktionierte Folgendes:Der eine Teil, der mich dazu brachte, war, dass ich diese Zeile hinzufügen musste
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.
quelle
Überprüfen Sie dies:
quelle
quelle