Mam centralną bazę danych, do której zapisuję wyniki pracy na wszystkich moich serwerach. Przekazuję 3 parametry przez PowerShell w zadaniu SQL z powrotem do SP na centralnym serwerze, który sprawdza, czy zadanie powinno być uruchomione w tym czasie itp. Informacje są następnie ujawniane przez SSRS, abyśmy mogli zobaczyć niepowodzenia zadań / zadania długo działające / i zadania, które nie zostały uruchomione, ale powinny mieć (lub jeśli ktoś popełnił błąd w harmonogramie).
Aby to zrobić, mam 2 kroki zadania dodane do każdego zadania na każdym serwerze i chciałbym zredukować skrypt do zaledwie jednego kroku dodanego do każdego zadania .. być może nawet wywołać go z udziału sieciowego.
Ale mój problem jest jednym z 3 parametrów, które przekazuję. Potrzebuję uzyskać identyfikator zadania lub nazwę zadania z poziomu zadania wykonania, więc nie muszę kodować parametru name na stałe. Trzy parametry, które przekazuję, to jobid, status (sukces / porażka), errormsg. Skrypt PowerShell, który napisałem, jest dość prosty.
Invoke-sqlcmd -ServerInstance „MYRemoteSYSTEM” -Database remoteDB -Query ”exec dbo.JOB_LOG„ NAZWA / IDENTYFIKATORA ”,„ Success / FAIL ”,„ BAD MESSAGE HERE ””
Zapisuje to, czego potrzebuję, do stołu. Obejrzałem msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / ale żadne z nich nie zagwarantuje, że dostanę identyfikator lub nazwę poprawnego zadania wykonawczego w przypadku, gdy jest więcej niż 1 zadanie wykonujące w o tym samym czasie.
Próbowałem nawet spojrzeć na sys.sysprocesses, ale myślę, że ponieważ zadanie agenta jest skryptem PowerShell, pokazuje się jako „.Net SqlClient Data Provider”, więc nie mogę przyciąć binarnego JOBID z zadań wyświetlanych jako „SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Krok 1) „--- dowiedziałem się z postu Denny'ego Cherry - dzięki denny-
Wszelkie pomysły na złapanie wykonującego jobid będą mile widziane.
Dzięki,
Chris
źródło
Aby to zadziałało, korzystałem z polecenia
invoke-sqlcmd
cmdlet w programie PowerShell przez agenta SQL. Korzystając z informacji, które otrzymałem powyżej, to, co wymyśliłem, działało:Jedną rzeczą, która mnie dopadła, było to, że musiałem dodać tę linię
ponieważ gdybym tego nie dodał, zmienna początkowa $ var przekazałaby długi nagłówek system.data.datatable z nazwą kolumny zadania, co spowodowało, że zmienna zepsuła zapytanie w czasie wykonywania.
Mam nadzieję, że może to pomóc komuś innemu w drodze.
źródło
Sprawdź to:
źródło
źródło