İş kimliğini veya işin içinden işin adını al


12

Geri tüm sunucularıma iş sonuçları yazmak merkezi bir DB var. Bir SQL işinde powershell aracılığıyla 3 parametreyi, işin o sırada çalışması gerektiğini doğrulayan merkezi sunucudaki bir sp'ye geri geçiririm. Daha sonra bilgi, bir iş hatası / uzun süre çalışan iş / & Çalışmamış ancak olması gereken işler (veya birisi bir programla uğraştıysa)

Bunu yapmak için, her sunucuda her işe eklenmiş 2 iş adımı var ve her iş için sadece 1 adım ekledi betiği azaltmak istiyorum .. muhtemelen hatta bir ağ paylaşımından çağırmak ..

Ama benim sorunum geçtiğim 3 parametreden biri. Ben name parametresini sabit kodlamak zorunda değilim yürütme işi içinde yürütme jobid veya iş adı almak gerekiyor. Geçtiğim 3 parametre iş kimliği, durum (başarı / başarısız), errormsg. Yazdığım powershell betiği oldukça basit.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -Database remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Başarılı / BAŞARISIZ', 'KÖTÜ MESAJ BURADA'"

Bu tabloya ihtiyacım olan şeyi yazıyor. Ben msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / 'a baktım ama bunların hiçbiri, 1'den fazla işin yürütülmesi durumunda doğru yürütme işinin kimliğini veya adını alacağımı garanti etmeyecek Aynı zaman.

Ben bile sys.sysprocesses baktı denedim ama ajan işi bir powershell komut dosyası olduğundan, ".Net SqlClient veri sağlayıcı" olarak gösterir, bu yüzden "SQLAgent - olarak gösterilen işler kapalı ikili JOBID kesemezsiniz düşünüyorum TSQL JobStep (İş 0xF1800243164745429C30474FFD5C990C: Adım 1) "--- bu Denny kiraz'ın gönderisinden öğrendim - teşekkürler denny-

Yürütme iş kimliğini nasıl alacağınıza dair herhangi bir fikir çok takdir edilecektir.

Teşekkürler,

Chris

Yanıtlar:


19

Kendi iş kimliğinizi almak için iş adımlarınızda jeton kullanmanız gerekecektir. Ayrıntılar burada: İş Adımlarında Jeton Kullanma .

Makalenin sonunda jobid ile ilgili bir örnek var:

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

Daha önce jetonlarla çalışıyordum, ancak onları terk ettim çünkü powershell ile düzgün çalışmalarını sağlayamadım. Şimdi hata ayıklıyorum. İkinize de çok teşekkür ederim.
CleanFill

1

Bunu işe almak için invoke-sqlcmd, sql ajan olsa powershell cmdlet kullanıyordum . Yukarıda aldığım bilgileri kullanarak, bu işe yaradı:

$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

Beni yakalayan tek parça, bu satırı eklemem gerektiğiydi

$varname = $var.name

çünkü ben bunu eklemediysem, ilk değişken $ var, işin sütun adıyla uzun bir system.data.datatable başlığında geçecekti, bu nedenle değişkenin sorguyu çalışma zamanında karıştırmasına neden oluyordu.

Umarım bu yoldan başka birine yardımcı olabilir.


0

Şuna göz at:

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.