it-swarm-eu.dev

Získejte ID úlohy OR Název úlohy z prováděné úlohy)

Mám centrální databázi, do které zapisuji výsledky úlohy na všechny své servery. Předám 3 parametry přes powerhell v SQL úloze zpět do sp na centrálním serveru, který ověří, že úloha by měla být spuštěna v té době atd. Informace jsou poté vystaveny přes SSRS, takže můžeme vidět selhání úlohy/dlouhé spuštěné úlohy/& úlohy, které se neběží, ale měly by mít (nebo pokud si někdo spal s plánem).

Abych toho dosáhl, přidám do každé úlohy na každém serveru 2 kroky úlohy a rád bych snížil skript na pouhý 1 krok přidaný do každé úlohy .. je možné jej dokonce nazvat ze síťové sdílené položky.

Ale můj problém je jedním ze 3 parametrů, které předávám. Potřebuji získat prováděcí jobid nebo název úlohy z prováděcí úlohy, takže nemusím tvrdě zakódovat parametr name. 3 parametry, které předávám, jsou jobid, status (success/fail), errormsg. Scénář PowerShell, který jsem napsal, je docela jednoduchý.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME/ID', 'Success/FAIL', 'BAD MESSAGE HERE' '

To píše, co potřebuji ke stolu. Podíval jsem se na msdb.dbo.sp_help_job/msdb.dbo.sp_get_composite_job_info/dbo.xp_sqlagent_enum_jobs/ale žádná z nich nezaručí, že dostanu ID nebo název správné prováděcí úlohy v případě, že na serveru bude spuštěno více než 1 úlohy stejný čas.

Dokonce jsem se pokusil podívat na sys.sysprocesses, ale myslím, že protože agent agent je skript powerhell, zobrazuje se jako „.Net SqlClient Data Provider“, takže nemohu oříznout binární JOBID mimo úlohy, které se zobrazují jako „SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Krok 1) "--- toto jsem se naučil od příspěvek Denny cherry - díky denny-

Jakékoli nápady, jak chytit vykonávajícího jobida, by se velmi ocenily.

Dík,

Chris

12
CleanFill

K získání vlastního ID úlohy budete muset ve svých krocích použít tokeny. Podrobnosti zde: Použití tokenů v pracovních krocích .

Na konci článku je jeden příklad s jobid:

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

Aby to fungovalo, používal jsem invoke-sqlcmd cmdlet v PowerShell, i když agent sql. Díky informacím, které jsem dostal výše, jsem zjistil, že to fungovalo:

$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

Jedinou částí, která mě dostala, bylo, že jsem musel přidat tento řádek

$varname = $var.name

protože kdybych to nepřidal, počáteční proměnná $ var by předala v záhlaví system.data.datatable dlouho s názvem sloupce úlohy, takže to způsobilo, že proměnná pokazí dotaz za běhu.

Doufám, že to může pomoci někomu jinému po silnici.

1
CleanFill

Koukni na tohle:

DECLARE @jobId BINARY(16)

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