मेरी नई नौकरी में, हमारे पास प्रत्येक सर्वर पर कई नामित उदाहरण हैं। जैसे
- Server1 \ देव
- Server1 \ DevIntegrated
- Server1 \ क्यूए
मेरे पास कार्यों में एक SQL PowerShell स्क्रिप्ट है जो OS को कॉल करता है, चालान करता है Foo.exe
लेकिन कमांड लाइन पैरामीटर (कनेक्शन स्ट्रिंग) पास करने की आवश्यकता होती है। SQL एजेंट कार्य प्रत्येक उदाहरण पर, PowerShell के एक चरण के साथ मौजूद होगा, जिसे यह जानना होगा कि वर्तमान संदर्भ क्या है। यानी यह क्रियान्वयन DevIntegrated पर शुरू हुआ।
मुझे हर स्क्रिप्ट को शुरू करने की कोई इच्छा नहीं है ...
$thisInstance = "Dev"
... खासकर तब से जब मुझे आने वाले महीनों में वातावरण (नए सर्वर और नामांकित उदाहरण) पर माइग्रेट करना होगा।
यदि मैं SQLPS शुरू करता हूं, तो मैं गेट-लोकेशन या रनिंग के परिणामों को स्लाइस और डीलींग करके अपनी आवृत्ति निर्धारित कर सकता हूं
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
जब SQL एजेंट PowerShell का काम शुरू करता है, तो यह C: \ windows \ system32 में शुरू होता है और Get-Location
यह SQLSERVER संदर्भ में नहीं होने के कारण काम नहीं करता है। मैं उस संदर्भ में बदल सकता हूं, लेकिन मैं SQL सर्वर के "रूट" पर रहूंगा और यह नहीं जान पाऊंगा कि मुझे किस स्थिति में होना चाहिए। Invoke-Sqlcmd
मार्ग का उपयोग करना या तो एक ही कारण से काम नहीं करेगा (तकनीकी रूप से, यह समय के रूप में है। कोई डिफ़ॉल्ट उदाहरण नहीं है)
अपने ज्ञान के सर्वश्रेष्ठ के लिए, मैंने सभी बुनियादी "चीजों" की गणना की है जो मैं नौकरी लॉग में प्राप्त कर सकता हूं लेकिन कुछ भी नहीं दिखा रहा है SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
ऐसा लगता है कि मैं उस चीज का इस्तेमाल कर सकता हूं और कुछ वूडू उदाहरणों को मारकर और स्पिड से मेल खाते हुए चीजों को एक साथ जोड़ने की कोशिश कर रहा हूं, लेकिन यह नरक से खूनी-हैक की तरह लगता है। कुछ बुनियादी होना चाहिए जो मुझे याद आ रहा है, क्या कोई कुछ प्रकाश डाल सकता है?
पावरशेल के विकल्प की जांच की गई
मैंने अन्य नौकरी प्रकारों का उपयोग करके जांच की थी और संतोषजनक समाधान नहीं मिला। अनुसंधान ने संकेत दिया कि SQL एजेंट के तहत सूचीबद्ध PowerShell SQLPS था और एजेंट पर राइट क्लिक करके इसका एक उदाहरण शुरू करने से मुझे सही स्थान पर गिरा दिया गया। यह केवल तब था जब मैंने अपने संवादात्मक कोड को नौकरी के चरण में चिपकाया, जिसे मैंने पहले उल्लेख किए गए अंतर के बारे में सीखा था।
नौकरी के प्रकार के ओएस ने मुझे एक समान स्थिति में डाल दिया कि मुझे यह निर्धारित करने का कोई तरीका नहीं मिला कि किस उदाहरण ने मुझे कमांड शेल में गिरा दिया। निश्चित रूप से, मैं sqlcmd कर सकता हूं और इसका मूल्य प्राप्त कर सकता हूं, @@servername
लेकिन अगर मुझे पता है कि sqlcmd शुरू करने के लिए क्या कनेक्शन है, तो मुझे डेटाबेस को क्वेरी करने की आवश्यकता नहीं होगी;)
TSQL शायद काम कर सकता है अगर हम सक्षम करते हैं, xp_cmdshell
लेकिन मुझे यकीन नहीं है कि अगर वे इसे चालू कर देते हैं --- सरकारी सुविधा और वे गैर-डिफ़ॉल्ट सेटिंग्स पर लगातार हो सकते हैं। फिर भी, मैं डायनेमिक एसक्यूएल के साथ फ्यूज़िंग कर रहा हूं और बहुत अधिक गति और शक्ति खो रहा हूं जो पावरशेल उधार देता है।
थोड़ा असावधान रहते हुए, मैंने पहले चरण में एक चर को परिभाषित करने और उत्तराधिकारी चरणों को पारित करने के बारे में सोचा लेकिन अनुसंधान ने इस लेख को एकाधिक नौकरी चरणों (बीओएल) को संभालते हुए बदल दिया।
जॉब स्टेप को स्व-निहित होना चाहिए। यही है, एक नौकरी बुलियन मूल्यों, डेटा, या नौकरी चरणों के बीच संख्यात्मक मूल्यों को पारित नहीं कर सकती है। हालाँकि, आप स्थायी तालिका या वैश्विक अस्थायी तालिकाओं का उपयोग करके मानों को एक Transact-SQL नौकरी चरण से दूसरे में पास कर सकते हैं। आप नौकरी के चरणों से मानों को पारित कर सकते हैं जो निष्पादन योग्य कार्यक्रमों को एक नौकरी के चरण से दूसरे नौकरी के चरणों तक फ़ाइलों का उपयोग करके चलाते हैं।
मैं एक अच्छी तरह से ज्ञात फ़ाइल / पर्यावरण चर / रजिस्ट्री सेटिंग की तरह सामान्य ट्रिक का उपयोग नहीं कर सकता, जो Foo.exe
कि उस समय के लिए समवर्ती निष्पादन को रोकता है।
टी एल; डॉ:
PowerShell के SQL एजेंट जॉब चरण में, आप प्रक्रिया शुरू करने वाले SQL सर्वर का उदाहरण कैसे निर्धारित कर सकते हैं?