2012-01-06 8 views
12

मेरे पास निम्न मास्टर स्क्रिप्ट है जो टेबल बनाता है, और कुछ डेटा डालने और फिर संग्रहीत प्रक्रियाओं को बनाता है।एसएसएमएस में एसक्यूएलसीएमडी मोड में फाइल का सापेक्ष पथ कैसे प्राप्त करें?

--todo_master.sql 

use master 
go 

:r todo_create_ddl.sql 
:r todo_create_dml.sql 
:r todo_create_sprocs.sql 
go 

हालांकि, भले ही todo_master.sql अन्य तीन लिपियों के रूप में ही रास्ते में है, यह उन तीन लिपियों पता लगाने में असमर्थ है।

A fatal scripting error occurred. 
The file specified for :r command was not found. 

अगर मैं नीचे की तरह पूर्ण पथ प्रदान करते हैं इन फ़ाइलों को मिल गया है और के रूप में इरादा क्रियान्वित कर रहे हैं:

मैं निम्नलिखित त्रुटि मिलती है।

"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"

मैं क्या याद किया जा सकता है?


संपादित जेसन ने सुझाव दिया जैसा कि मैंने इस की कोशिश की, लेकिन अभी भी एक ही त्रुटि मिलती है: sqlcmd setvar विकल्प का उपयोग कर एक के लिए पथ निर्दिष्ट करने के लिए द्वारा

use master 
go 

:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects" 
:setvar ddl "todo_create_ddl.sql" 
:setvar dml "todo_create_dml.sql" 
:setvar sprocs "todo_create_sprocs.sql" 

:r $(path)$(ddl) 
:r $(path)$(dml) 
:r $(path)$(sprocs) 
go 
+2

एक संबंधित [मुद्दा] (https://connect.microsoft.com:

संशोधित todo_master.sql एक वातावरण चर mypath कहा जाता है का उपयोग करने के/VisualStudio/फीडबैक/विवरण/6679 9 4/sqlcmd-execution-r-not-support-right) connect.microsoft.com – Animesh

उत्तर

21

आप इस के आसपास काम कर सकते हैं चर। फिर अपने :r कॉल की तरह में कि चर का उपयोग:

:setvar path "c:\some path" 
:r $(path)\myfile.sql 

इस कड़ी है गहराई उदाहरण में अधिक: http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

जगह में आप setVar लाइन को हटाने और उस में कमांड लाइन से पारित कर सकते हैं कि के साथ

साथ:

Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath 

यह उस स्क्रिप्ट के मुद्दे के आसपास काम करेगा जहां निर्देशिका से नहीं चल रहा था, जहां पहली SQL स्क्रिप्ट को बुलाया गया था।

+0

सुझाव के लिए धन्यवाद। दुर्भाग्य से यह मेरे लिए काम नहीं किया। मैंने आपके सुझाव के आधार पर मैंने जो कोशिश की है, उसे शामिल करने के लिए प्रश्न को अद्यतन किया है। – Animesh

+0

चर के बीच बैकस्लैश डालने का प्रयास करें।: आर $ (पथ) \ $ (डीडीएल) –

+0

मैंने बैकस्लैश को बीच में डालने का प्रयास किया, अभी भी – Animesh

3

मैं पाया है, कि यह सबसे अच्छा होगा:

:setvar path C:\"some path" 

:r $(path)\myfile.sql 

आप उद्धरण में एक स्थान के साथ बयान डाल करने के लिए है, लेकिन संपूर्ण बयान। यही कारण है कि आप C:\"some path"

5

मुझे एहसास है कि यह बहुत पुराना है, लेकिन मैंने आपके संपादित कोड में एक त्रुटि देखी: आपको पथ और स्क्रिप्ट नाम के बीच बैकस्लैश शामिल करने की आवश्यकता है।

:r $(path)\$(ddl) 
:r $(path)\$(dml) 
:r $(path)\$(sprocs) 
3

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

!! PWD 

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

तो तुम क्या कर सकते हैं:

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

:r $(TEMP)\relative_path.txt 

:r $(mypath)\todo_create_ddl.sql 
GO 
:r $(mypath)\todo_create_dml.sql 
GO 
:r $(mypath)\todo_create_sprocs.sql 
GO 

नोट्स है कि चर सेट होगा:

  • उपरोक्त विधि सिस्टम पर केवल 1 फ़ाइल मान लिया गया todo_master.sql नाम पर है। ड्राइव: एक से अधिक फ़ाइल है कि नाम है, तो पिछले एक पाया पथ relative_path.txt फ़ाइल

  • CD C:\ कर सी की जड़ में शुरू कर देंगे में सेट हो जाएगा। यह शायद शुरू करने के लिए सबसे कुशल जगह नहीं है। आप आम तौर पर एक क्षेत्र में अपने एसक्यूएल फ़ाइलें हैं, तो इस तरह के रूप सी:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ... 
    
    : \ Users {YourLogin} \ दस्तावेज़ \ विजुअल स्टूडियो 2013 \ परियोजनाओं
    , तो बस CD आदेश गंतव्य के साथ नज़दीकी बढ़ाने जैसे बदलने के लिए,
+0

आपके समाधान के लिए धन्यवाद, एक मामूली चिमटा यह है कि यदि आपके पथ में रिक्त स्थान हैं तो आपको ** FOR ** कमांड के लिए ** delims ** विकल्प शामिल करने की आवश्यकता है। उदाहरण: 'FOR" delims =; " % बी में (... ' –

0

मैं इस एक ही मुद्दा अपने आप को था और मुझे आशा है कि मैं स्पष्ट करते हुए कहा नहीं कर रहा हूँ - क्यों एक डॉस/Cmd या PowerShell उदाहरण नहीं खोल, निर्देशिका स्क्रिप्ट युक्त cd, फिर वहाँ से प्रबंधन स्टूडियो लोड? तो समाधान फ़ाइल वाले फ़ोल्डर पर

Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe" 

मैं cd, तो मैं

Ssms mysolution.ssmssln 
0

उपयोग करें:

मैं अपने PowerShell सेट-अप में इस अन्य नाम हैं, (अपने पथ भिन्न हो सकती है) एक सहायक के रूप में एक बैचफाइल।

use master 
go 
:r $(mypath)\todo_create_ddl.sql 
:r $(mypath)\todo_create_dml.sql 
:r $(mypath)\todo_create_sprocs.sql 
go 

और अपने बैच फ़ाइल में todo_master.bat

/* set the environment variable to the current directory */ 
SET mypath=%cd% 
/* run your sql command */ 
sqlcmd -i todo_master.sql 
संबंधित मुद्दे