2008-09-26 12 views
5

टी एसक्यूएल में सापेक्ष पथ कैसे प्राप्त करें? उदाहरण के लिए एक .sql फ़ाइल फ़ोल्डर डी: \ temp में स्थित है, मैं फ़ोल्डर डी: \ temp \ App_Data में फ़ाइल hello.txt का पथ प्राप्त करना चाहता हूं। सापेक्ष पथ संदर्भ का उपयोग कैसे करें?टी एसक्यूएल में सापेक्ष पथ?

मान लीजिए कि मैं एसक्यूएल सर्वर प्रबंधन स्टूडियो के अंदर एसक्यूएल फ़ाइल को क्रियान्वित कर रहा हूँ करते हैं।

+0

क्या आप इसे संग्रहीत प्रक्रिया के अंदर नहीं करना चाहते हैं? –

+0

हां, मैं इसे संग्रहीत प्रक्रिया – Graviton

+0

के अंदर करना चाहता हूं। मुझे विश्वास नहीं है कि .sql फ़ाइल की सामग्री में उस फ़ाइल का कोई ज्ञान है जिसमें वे शामिल थे, यानी वे नहीं जानते कि वे कहां हैं एक 'रिश्तेदार' पथ निर्धारित या निर्माण नहीं कर सकता। –

उत्तर

3

सर्वर T-SQL निष्पादित हो रहा है। यह नहीं जानता कि क्लाइंट ने फ़ाइल को कहाँ से लोड किया था। आपको स्क्रिप्ट के भीतर एम्बेडेड पथ होना होगा।

DECLARE @RelDir varchar(1000) 
SET @RelDir = 'D:\temp\' 
... 

शायद आप प्रोग्राम पथ सेट कमांड में .SQL स्क्रिप्ट फ़ाइल के भीतर जगह कर सकते हैं, या शायद आप sqlcmd का उपयोग करें और एक चर के रूप में में रिश्तेदार निर्देशिका पारित कर सकते हैं।

6

.sql फ़ाइल बस .... एक फ़ाइल है। इसका अपने स्थान की कोई समझ नहीं है। यह वह चीज है जो इसे उत्तेजित करती है (जिसे आपने निर्दिष्ट नहीं किया था) जो कि इसके स्थान, फ़ाइल का स्थान होगा।

मुझे लगता है कि आप एक App_Data फ़ोल्डर उल्लेख किया नोटिस, इसलिए मुझे लगता है कि कि ASP.NET शामिल है। यदि आप अपने वेब अनुप्रयोग में संबंधित पथ का उपयोग करना चाहते हैं, तो देखने के MapPath

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx

3

जब T-SQL निष्पादित हो रहा है, यह सर्वर पर एक बैच में चल रहा है ग्राहक प्रबंधन स्टूडियो चल मशीन पर नहीं (या कोई अन्य एसक्यूएल क्लाइंट)। क्लाइंट निष्पादित होने के लिए सर्वर पर .sql फ़ाइल की टेक्स्ट सामग्री भेजता है। इसलिए, जब तक कि डेटाबेस डेटाबेस सर्वर पर स्थित न हो, मुझे संदेह है कि आप SQL स्क्रिप्ट से इसके साथ संवाद करने में सक्षम होंगे।

1

T-SQL स्क्रिप्ट पहले QueryAnalyzer, SSMS द्वारा preprocessed या ग्राहक के पक्ष sqlcmd है। ये प्रोग्राम फ़ाइल स्थानीयकरण से अवगत हैं और ओकेकल स्क्लप्लस के समान सापेक्ष पैच को आसानी से संभाल सकते हैं।

जाहिर है इस Microsoft से सिर्फ एक डिजाइन निर्णय है और मैं कहता हूँ एक नहीं बल्कि बेवकूफ एक की हिम्मत।

0

अच्छी तरह से यह एक Microsoft बात पहले बंद नहीं है ... यह एक उद्योग मानक बात है। दूसरा एक रिश्तेदार पथ के साथ T-SQL चलाने के लिए अपने समाधान आईई अपने पथ बयान इंजेक्षन करने के लिए एक बैच स्क्रिप्ट या कुछ और उपयोग करने के लिए है:

@echo OFF 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t-SQL.SQL"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    set RunLocation=%~dp0 
    echo(%~dp0!var! > newsql.sql 
    ENDLOCAL 
) 
sqlcmd newsql.sql 

या कुछ और की तरह है कि वैसे भी

+0

उस लांस की सफाई के लिए धन्यवाद ... :) –

4

मैं एक समान समस्या थी, और% CD% छद्म-चर के संयोजन के साथ sqlcmd चर का उपयोग करके इसे हल किया। सभी टुकड़ों को गठबंधन करने के लिए कुछ परीक्षण और त्रुटि ली। लेकिन अंत में यह सब काम कर रहा है। यह उदाहरण script.sql फ़ाइल को runscript.bat के समान निर्देशिका में होने की अपेक्षा करता है।

runscript.bat

sqlcmd -S .\SQLINSTANCE -v FullScriptDir="%CD%" -i script.sql -b 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 
0

मैंने कोशिश की mateuscb की टिप्पणी से विधि। मैंने पाया कि यह काम नहीं कर सकता, मुझे नहीं पता क्यों, फिर मैंने कई परीक्षणों के बाद प्रबंधित किया। यह नीचे स्क्रिप्ट के साथ काम कर सकते हैं:

runscript.bat

@set FullScriptDir=%CD% 
sqlcmd -S .\SQLINSTANCE -i script.sql 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 
बस आगे की चर्चा के लिए आपकी जानकारी के लिए