Dapatkan ID Pekerjaan ATAU Nama pekerjaan dari dalam melaksanakan pekerjaan

12

Saya memiliki pusat DB yang saya tulis hasil pekerjaan di semua server saya kembali ke. Saya melewati 3 parameter melalui PowerShell dalam pekerjaan SQL kembali ke sp di server pusat yang memverifikasi pekerjaan harus berjalan pada waktu itu, dll. Info ini kemudian diekspos melalui SSR sehingga kita dapat melihat kegagalan pekerjaan / pekerjaan yang berjalan lama / & pekerjaan yang belum berjalan tetapi seharusnya (atau jika seseorang mengacaukan jadwal).

Untuk melakukan ini, saya memiliki 2 langkah kerja yang ditambahkan ke setiap pekerjaan di setiap server dan saya ingin mengurangi skrip menjadi hanya 1 langkah yang ditambahkan ke setiap pekerjaan .. bahkan mungkin menyebutnya dari jaringan berbagi ..

Tetapi masalah saya adalah salah satu dari 3 parameter yang saya berikan. Saya perlu mendapatkan jobid pelaksana atau nama pekerjaan dari dalam pekerjaan pelaksana jadi saya tidak perlu mengubah kode parameter nama. 3 parameter yang saya lewati adalah jobid, status (berhasil / gagal), errormsg. Skrip PowerShell yang saya tulis cukup mudah.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Sukses / GAGAL', 'PESAN BURUK DI SINI'

Ini menulis apa yang saya butuhkan di atas meja. Saya telah melihat msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / tetapi tidak satupun dari ini akan menjamin saya mendapatkan ID atau nama pekerjaan pelaksana yang benar jika ada lebih dari 1 pekerjaan yang dieksekusi di waktu yang sama.

Saya bahkan sudah mencoba melihat proses sys.sys tapi saya pikir karena pekerjaan agen adalah skrip PowerShell, ini menunjukkan sebagai ". Penyedia Data SqlClient Bersih" jadi saya tidak dapat memangkas biner JOBID dari pekerjaan yang menunjukkan "SQLAgent - TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C: Langkah 1) "--- ini saya pelajari dari pos Denny cherry - terima kasih denny-

Setiap ide tentang cara mengambil jobid pelaksana akan sangat dihargai.

Terima kasih,

Chris

Bersihkan Isi
sumber

Jawaban:

19

Anda harus menggunakan token dalam langkah-langkah pekerjaan Anda untuk mendapatkan id pekerjaan Anda sendiri. Detail di sini: Menggunakan Token dalam Langkah-Langkah Pekerjaan .

Di akhir artikel ada satu contoh dengan jobid:

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 
Marian
sumber
Saya bekerja dengan token sebelumnya, tetapi meninggalkan mereka karena saya tidak bisa membuat mereka bekerja dengan benar dengan PowerShell. Saya sedang debug sekarang. Terima kasih banyak.
Bersihkan
1

Untuk mendapatkan ini berfungsi, saya menggunakan invoke-sqlcmdcmdlet di PowerShell meskipun agen sql. Dengan menggunakan informasi yang saya terima di atas, inilah yang saya temukan yang berfungsi:

$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

Satu bagian yang membuat saya adalah saya harus menambahkan baris ini

$varname = $var.name

karena jika saya tidak menambahkan ini, variabel awal $ var akan melewati header system.data.datatable lama dengan nama kolom pekerjaan, sehingga menyebabkan variabel untuk mengacaukan kueri pada saat run time.

Semoga ini bisa membantu orang lain di jalan.

Bersihkan Isi
sumber
0

Periksa ini:

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'
Gerben Kolkman
sumber
-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
sumber