Uzyskaj identyfikator zadania LUB nazwę zadania z poziomu wykonywanego zadania

12

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

CleanFill
źródło

Odpowiedzi:

19

Będziesz musiał użyć tokenów na etapach pracy, aby uzyskać własny identyfikator pracy. Szczegóły tutaj: Korzystanie z tokenów w krokach zadania .

Na końcu artykułu jest jeden przykład z jobid:

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 
Marian
źródło
Pracowałem z tokenami wcześniej, ale porzuciłem je, ponieważ nie mogłem zmusić ich do poprawnej pracy z PowerShellem. Debuguję teraz. Dziękuję oboje bardzo.
CleanFill
1

Aby to zadziałało, korzystałem z polecenia invoke-sqlcmdcmdlet w programie PowerShell przez agenta SQL. Korzystając z informacji, które otrzymałem powyżej, to, co wymyśliłem, działało:

$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

Jedną rzeczą, która mnie dopadła, było to, że musiałem dodać tę linię

$varname = $var.name

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.

CleanFill
źródło
0

Sprawdź to:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'
Gerben Kolkman
źródło
-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)
Virendra Agrawal
źródło