Получить идентификатор задания или имя задания из выполняемой работы

12

У меня есть центральная БД, в которую я записываю результаты работы на всех моих серверах. Я передаю 3 параметра через powershell в задании SQL обратно в sp на центральном сервере, который проверяет, что задание должно быть запущено в это время, и т. Д. Затем информация предоставляется через SSRS, чтобы мы могли видеть сбои заданий / длительные задания / & задания, которые не выполнялись, но должны были выполняться (или если кто-то испортил расписание).

Чтобы сделать это, у меня есть 2 шага задания, добавленных к каждому заданию на каждом сервере, и я хотел бы сократить сценарий до 1 шага, добавленного к каждому заданию .. возможно, даже вызвать его из общего сетевого ресурса.

Но моя проблема - один из трех параметров, которые я передаю. Мне нужно получить исполняемый идентификатор задания или имя задания из выполняемого задания, поэтому мне не нужно жестко задавать параметр имени. Я передаю 3 параметра: jobid, статус (успех / неудача), errormsg. Сценарий powershell, который я написал, довольно прост.

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

Это пишет то, что мне нужно к таблице. Я посмотрел на msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs /, но ни один из них не гарантирует, что я получу идентификатор или имя правильного выполняемого задания в том случае, если в нем выполняется более 1 задания в то же время.

Я даже пытался взглянуть на sys.sysprocesses, но я думаю, что, поскольку задание агента является сценарием PowerShell, он отображается как «.Net SqlClient Data Provider», поэтому я не могу обрезать двоичный JOBID из заданий, которые отображаются как «SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Шаг 1) "--- это я узнал из поста Денни Черри - спасибо denny-

Буду очень признателен за любые идеи о том, как захватить выполняемый jobid.

Спасибо,

Крис

CleanFill
источник

Ответы:

19

Вы должны будете использовать токены на своих этапах работы, чтобы получить свой собственный идентификатор работы. Подробности здесь: Использование токенов в рабочих шагах .

В конце статьи есть один пример с jobid:

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 
Мэриан
источник
Ранее я работал с токенами, но отказался от них, потому что не мог заставить их работать правильно с powershell. Я сейчас отлаживаю. Большое спасибо вам обоим.
CleanFill
1

Чтобы заставить это работать, я использовал invoke-sqlcmdкомандлет в powershell через агент sql. Используя информацию, которую я получил выше, я понял, что сработало:

$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

Одна часть, которая получила меня, была то, что я должен был добавить эту строку

$varname = $var.name

потому что, если бы я не добавил это, начальная переменная $ var передавала бы длинный заголовок system.data.datatable с именем столбца задания, поэтому это приводило к тому, что переменная мешала выполнению запроса во время выполнения.

Надеюсь, что это может помочь кому-то еще в будущем.

CleanFill
источник
0

Проверь это:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'
Гербен Колкман
источник
-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)
Вирендра Агравал
источник