2008-09-26 39 views
5

T sql'de göreli yol nasıl elde edilir? Örneğin bir .sql dosyası D: \ temp klasöründe bulunur, D: \ temp \ App_Data klasöründe hello.txt dosyasının yolunu bulmak istiyorum. Göreli yol referansı nasıl kullanılır?T sql'deki göreli yol?

SQL server yönetim stüdyosunun içinde sql dosyasını çalıştırdığımı varsayalım.

+0

Saklı yordamın içinde yapmak zorunda değil misiniz? –

+0

Evet, saklı bir yordamın içinde yapmak istiyorum – Graviton

+0

Bir .sql dosyasının içeriğinin içerdikleri dosya hakkında herhangi bir bilgi sahibi olduğunu sanmıyorum, yani 'nerede' olduklarını bilmiyorlar. 'göreli' bir yol belirleyemez veya yapılamaz. –

cevap

3

Sunucu, t-sql'yi yürütüyor. İstemcinin dosyayı nereden yüklediği bilinmiyor. Komut dosyasının içine gömülü olan yolun olması gerekir.

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

Belki programlı .sql komut dosyası içinde SET komutunun içine yolunu yerleştirebilir veya belki Sqlcmd kullanmak ve bir değişken olarak göreceli dizin geçebilir.

6

.sql dosyası bir dosyadır. Kendi konumuyla ilgili hiçbir fikri yok. Bu, onun yerini, dosyanın konumunu anlayabilecek olan (ki siz belirtmediniz) kesen şeydir.

Bir App_Data klasöründen bahsettiğinizi fark ettim, bu yüzden ASP.NET'in dahil olduğunu tahmin ediyorum. web uygulamasında göreli yolları kullanmak istiyorsanız, bkz MapPath

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

3

T-SQL yürütürken zaman, değil Management Studio çalıştıran istemci makinesinde, sunucu üzerindeki bir toplu çalışan (veya başka bir SQL istemcisi). İstemci, .sql dosyasının metin içeriğini çalıştırılacak sunucuya gönderir. Yani, bu dosya veritabanı sunucusunda bulunmadığı sürece, bir SQL komut dosyasından onunla etkileşime girebileceğinizden şüpheliyim.

1

T-sql komut dosyası ilk olarak istemci tarafında QueryAnalyzer, SSMS veya sqlcmd tarafından önişlemlenmiştir. Bu programlar, dosya yerelleştirmesinin farkındadır ve Oeacle sqlplus'a benzer göreceli yolları kolayca işleyebilir.

Açıkçası bu, Microsoft'un bir tasarım kararıdır ve oldukça aptalca bir şey söyleyebilirim.

0

iyi bir Microsoft sorunu değil, bu bir endüstri standardı olayıdır. ikinci göreli bir yol ile T-SQL çalıştırmak için Çözümünüz yol ifadesi enjekte etmek bir toplu komut dosyası veya bir şey kullanmak IE ise:

@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 

falan o zaten

+0

Bu mızrağı temizlemek için teşekkürler ... :) –

4

Ben benzer bir sorun vardı gibi ve% CD% sözde değişkeni ile birlikte sqlcmd değişkenlerini kullanarak çözdüm. Bütün parçaları birleştirmek için biraz deneme ve hata yaptık. Ama sonunda hepsi işe yaradı. Bu örnek, script.sql dosyasının runscript.bat ile aynı dizinde olmasını bekler.

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

Ben mateuscb yorumlardan yöntemini denedik. Çalışamıyorum, nedenini bilmiyorum, sonra birkaç testten sonra idare ettim. Aşağıda komut dosyası ile çalışabilirsiniz:

runscript.bat

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

script.sql Sadece daha fazla tartışma için bilginize

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

.