जॉब आईडी या जॉब का नाम एग्जीक्यूटिंग जॉब के भीतर से प्राप्त करें


12

मेरे पास एक केंद्रीय डीबी है जिसे मैं अपने सभी सर्वर पर नौकरी के परिणाम लिखता हूं। मैं एक SQL नौकरी में शक्तियों के माध्यम से 3 मापदंडों को केंद्रीय सर्वर पर एक सपा में वापस भेज देता हूं जो यह पुष्टि करता है कि नौकरी उस समय चल रही होनी चाहिए, आदि जानकारी तब SSRS के माध्यम से सामने आती है ताकि हम एक नौकरी विफलताओं / लंबे समय तक चलने वाली नौकरी / देख सकें & नौकरियां जो नहीं चलती हैं, लेकिन होनी चाहिए (या अगर किसी ने शेड्यूल के साथ गड़बड़ की है)।

ऐसा करने के लिए, मेरे पास प्रत्येक सर्वर पर प्रत्येक जॉब में 2 जॉब स्टेप्स हैं और मैं प्रत्येक जॉब में जोड़े गए स्क्रिप्ट को केवल 1 स्टेप तक कम करना चाहूंगा..यहां तक ​​कि इसे नेटवर्क शेयर से भी कॉल कर सकते हैं।

लेकिन मेरा मुद्दा उन 3 मापदंडों में से एक है जो मैं पास करता हूं। मुझे निष्पादन की नौकरी के भीतर से निष्पादित नौकरी या नौकरी का नाम प्राप्त करने की आवश्यकता है, इसलिए मुझे नाम पैरामीटर को हार्डकोड करने की आवश्यकता नहीं है। मेरे द्वारा पास किए गए 3 पैरामीटर जॉबिड, स्टेटस (सफलता / असफलता), इरोमार्ग हैं। मेरे द्वारा लिखी गई शक्तियाँ लिपि बहुत सीधी है।

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM" -डैटेबस रिमोटडीबी-वाईवाई "अमल dbo.JOB_LOG 'जॉबनाम / आईडी', 'सक्सेस / फेल', 'बीएड मेसेज हियर'"

यह लिखता है कि मुझे मेज पर क्या चाहिए। मैंने msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs / पर देखा है, लेकिन इनमें से कोई भी गारंटी नहीं देगा कि मुझे उस ईवेंट या सही ईवेंट का नाम मिल गया है जिसमें 1 से अधिक कार्य निष्पादित हो रहे हैं। उसी समय।

मैंने sys.sysprocesses पर भी देखने की कोशिश की है, लेकिन मुझे लगता है कि चूंकि एजेंट की नौकरी एक पॉवरशेल स्क्रिप्ट है, इसलिए यह ".net SqlClient डेटा प्रदाता" के रूप में दिखाता है, इसलिए मैं बाइनरी जॉब को "SQLAgent" के रूप में दिखाने वाली नौकरियों से ट्रिम नहीं कर सकता हूं - TSQL जॉबस्टेप (नौकरी 0xF1800243164745429C30474FFD5C990C: चरण 1) "--- यह मैंने डेनी चेरी के पोस्ट से सीखा - धन्यवाद डेनी-

निष्पादित जॉब को कैसे हथियाना है, इस पर किसी भी विचार की बहुत सराहना की जाएगी।

धन्यवाद,

क्रिस

जवाबों:


19

आपको अपनी नौकरी आईडी प्राप्त करने के लिए अपने नौकरी के चरणों में टोकन का उपयोग करना होगा। यहाँ विवरण: नौकरी चरणों में टोकन का उपयोग करना

लेख के अंत में jobid के साथ एक उदाहरण है:

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

मैं पहले टोकन के साथ काम कर रहा था, लेकिन मैंने उन्हें छोड़ दिया क्योंकि मैं उन्हें पॉवरशेल के साथ सही तरीके से काम नहीं कर पाया। अभी डिबेट कर रहा हूं। आप दोनों को बहुत - बहुत धन्यवाद।
क्लीनफिल

1

इसे काम करने के लिए, मैं invoke-sqlcmdcmdlet का उपयोग पॉलीशेल में कर रहा था, हालांकि 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.