Отримайте ідентифікатор роботи АБО Ім'я роботи в межах виконання завдання


12

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

Для цього в кожне завдання на кожному сервері додано 2 етапи завдання, і я хотів би зменшити скрипт до всього 1 кроку, доданого до кожної роботи.

Але моє питання - один із 3 параметрів, які я проходжу. Мені потрібно отримати виконане завданняID або ім'я роботи з виконуваного завдання, тому мені не доведеться жорстко кодувати параметр імені. Три параметри, які я передаю, - це робота, статус (успіх / невдача), помилка. Я написав написаний сценарій досить просто.

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.sysprocess, але я думаю, оскільки робота агента є скриптом повноважень, він відображається як ".Net SqlClient Provider Data", тому я не можу відрізати бінарний JOBID від завдань, що відображаються як "SQLAgent - TSQL JobStep (робота 0xF1800243164745429C30474FFD5C990C: крок 1) "--- це я дізнався з посту Денні вишні - спасибі denny-

Будемо дуже вдячні за будь-які ідеї, як захопити виконуючого завдання.

Спасибі,

Кріс

Відповіді:


19

Для отримання власного ідентифікатора роботи вам доведеться використовувати маркери у своїх робочих кроках. Докладніше тут: Використання жетонів у кроках роботи .

В кінці статті є один приклад із завданням:

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

Раніше я працював з маркерами, але відмовився від них, оскільки не міг змусити їх правильно працювати з паттерном. Я зараз налагоджую. Дуже дякую обом.
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 довго із назвою стовпця завдання, тож це спричиняло зміну зіпсувати запит під час виконання.

Сподіваюся, що це може допомогти комусь іншому в дорозі.



-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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.