मुझे वर्तमान स्क्रिप्ट के सापेक्ष पथ का उपयोग करने के लिए SSMS कैसे मिलता है: SSDT जैसे sqlcmd मोड में r करता है?


11

अगर मेरे पास foo.sql और bar.sql एक ही फ़ोल्डर में हैं, तो foo.sql SSDT से sqlcmd मोड में चलाने पर bar.sql को संदर्भित कर सकता है :r ".\bar.sql"। हालाँकि, SSMS इसे नहीं ढूंढेगा। प्रोकम शो में SSMS दिख रहा है %systemroot%\syswow64:

एनोटेट प्रोमोन स्क्रीनशॉट

मैं SSMS को फ़ोल्डर में देखने के लिए कैसे कहता हूं कि वर्तमान स्क्रिप्ट को स्पष्ट रूप से पथ घोषित किए बिना सहेजा गया है?

जवाबों:


8

SSMS में एक सापेक्ष पथ प्राप्त करना ऐसा नहीं है कि जब से आप स्क्रिप्ट को निष्पादित नहीं कर रहे हैं, वह सीधे-आगे है; SSMS ने स्क्रिप्ट को मेमोरी में लोड किया है और अपने पाठ को निष्पादित कर रहा है। तो वर्तमान निर्देशिका / फ़ोल्डर डिफ़ॉल्ट प्रक्रिया शुरू करने वाला फ़ोल्डर है। आप इसे SSC में SQLCMD मोड में चलाकर देख सकते हैं:

!! PWD

हालांकि, मुझे ऐसा करने के लिए एक थोड़े-थोड़े तरीके का पता चला। मैं मानता हूं कि ऐसा करने के लिए यह सबसे आदर्श तरीका नहीं है, हालांकि, वर्तमान में यह एक सच्चा रिश्तेदार पथ प्राप्त करने का एकमात्र तरीका है (यह देखते हुए कि पथ को चर में सेट करना वास्तव में "सापेक्ष" नहीं है )।

तो आप क्या कर सकते हैं:

  1. Foo.sql को खोजने के लिए DOS कमांड निष्पादित करें और उस फ़ाइल में पथ को उस फ़ाइल में एक फ़ोल्डर में संग्रहीत करें जिसे आप SSMS से प्राप्त कर सकते हैं, या तो क्योंकि यह एक हार्ड-कोडेड पथ है या क्योंकि यह एक पर्यावरण चर का उपयोग करता है जो उपलब्ध है SSOS में DOS कमांड और SQLCMD मोड दोनों
  2. उस फ़ाइल में पथ संग्रहीत करते समय, इसे SQLCMD मोड कमांड के रूप में संग्रहीत करें जो उस पथ पर एक चर सेट करता है
  3. SSMS का उपयोग करके उस पाठ फ़ाइल को आयात करें :rऔर यह उस चर को वांछित पथ पर सेट करेगा
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S foo.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\bar.sql

टिप्पणियाँ:

  • उपरोक्त विधि सिस्टम पर केवल 1 फ़ाइल मानती है जिसका नाम foo.sql है । यदि एक से अधिक फ़ाइल में यह नाम है, तो अंतिम पाया गया पथ सापेक्ष_ path.txt फ़ाइल में पथ सेट किया जाएगा

  • CD C:\वसीयत करना C: ड्राइव के मूल में शुरू होगा । यह शायद शुरू करने के लिए सबसे कुशल जगह नहीं है। यदि आपके पास आमतौर पर C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects जैसे क्षेत्र में आपकी SQL फाइलें हैं , तो बस CDगंतव्य के करीब पहुंचने के लिए कमांड बदलें , जैसे:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...

यह रचनात्मक है, लेकिन धीमी और डिस्क गहन करने के लिए।
जस्टिन डियरिंग

2
@JustinDearing जैसा कि मैंने अपने जवाब में कहा, यह a) गैर-आदर्श है, और b) अगर रूट डाइरेक्टरी से शुरू हो रहा है, तो b) धीमा है, लेकिन c) एक ही तरीका है कि मैं इसे तकनीकी रूप से सापेक्ष होने के लिए देख सकता हूं । मुझे यकीन नहीं है कि हार्ड-ड्राइव को इंडेक्स करने से प्रदर्शन की समस्या दूर हो जाएगी।
सोलोमन रटज़की

हालांकि यह मुझे दुखी करता है, यह निश्चित रूप से सबसे अच्छा जवाब है जिसमें किसी अन्य कमांड स्क्रिप्ट से रास्ता तय करना या इसे फ़ाइल में कोड करना मुश्किल नहीं है।
कतार हैमर

5

मैं गलत हो सकता हूं, लेकिन मुझे नहीं लगता कि यह संभव है। कृपया इन लिंक को देखें कि दूसरों ने क्या किया है (कोई भी आदर्श नहीं है)।

/programming/8753541/how-to-get-the-relative-path-of-file-in-sqlcmd-mode-in-ssms

http://boardreader.com/thread/Specifying_relative_path_to_r_command_in_lmlz__f0c78408-e001-48a2-8369-338c9534f496.html


ठीक है कि बेकार है, लेकिन मुझे लगता है कि यह SSDT उपयोग को प्रोत्साहित करता है।
जस्टिन डियरिंग

2

मैं आपके sqlcmd चर फ़ाइल को 'C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp' में सहेजने की सलाह देता हूं और इसे मेरी सभी परियोजनाओं से $ (TEMP) \ sqlcmd -variables.sql के रूप में संदर्भित करता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.