SSMS'nin geçerli komut dosyasının göreli yolunu şu şekilde kullanmasını nasıl sağlayabilirim: SSDT gibi sqlcmd modunda r?


11

Aynı klasörde foo.sql ve bar.sql varsa, sqlcmd modunda SSDT'den çalıştırıldığında foo.sql bar.sql'ye başvurabilir :r ".\bar.sql". Ancak, SSMS bulamaz. Procmon SSMS'nin aradığını gösteriyor %systemroot%\syswow64:

Annotated Procmon ekran görüntüsü

SSMS'ye yolu açıkça bildirmeden geçerli komut dosyasının kaydedildiği klasöre bakmasını nasıl söyleyebilirim?

Yanıtlar:


8

Komut dosyasını yürütmediğiniz için SSMS'de göreli bir yol elde etmek o kadar da kolay değildir; SSMS komut dosyasını belleğe yükledi ve metnini yürütüyor. Dolayısıyla, geçerli dizin / klasör varsayılan işlem başlangıç ​​klasörüdür. SSMS'de SQLCMD modunda aşağıdakileri çalıştırarak bunu görebilirsiniz:

!! PWD

Ancak bunu yapmanın bir tür yolunu buldum. Bunun bunu yapmanın en ideal yolu olmadığını itiraf ediyorum, ancak şu anda gerçek bir göreceli yol almanın tek yolu gibi görünüyor (bir değişkende yolu ayarlamanın gerçekten "göreceli" olmadığı göz önüne alındığında, ).

Yani yapabileceğiniz şey:

  1. Foo.sql dosyasını bulmak için bir DOS komutu yürütün ve bu dosyanın yolunu, sabit kodlanmış bir yol olduğu veya kullanılabilen bir ortam değişkeni kullandığı için SSMS'den alabileceğiniz bir klasördeki bir metin dosyasına depolayın SSMS'de hem DOS komutu hem de SQLCMD moduna
  2. Yolu bu dosyaya kaydederken, SQLCMD modu komutu olarak saklayın ve bu yola bir değişken ayarlar
  3. Bu metin dosyasını kullanarak SSMS'ye aktarın :rve bu değişkeni istenen yola ayarlayacaktı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

Notlar:

  • Yukarıdaki yöntem, sistemdeki yalnızca 1 dosyanın foo.sql olarak adlandırıldığını varsayar . Birden fazla dosya bu ada sahipse, bulunan son dosya relative_path.txt dosyasında ayarlanan yol olur

  • Bunu yapmak C: sürücüsünün CD C:\kökünden başlar . Bu muhtemelen başlamak için en verimli yer değil. SQL dosyalarınızı genellikle C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects gibi bir alanınız varsa , hedefe yaklaşmak için komutu değiştirin , örneğin:CD

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

Bu yaratıcı, ancak yavaş ve disk yoğun.
Justin Dearing

2
@JustinDearing Cevabımda söylediğim gibi, a) ideal değil ve b) bir kök dizinden başlıyorsa yavaş, ancak c) bunu görmenin tek yolu teknik olarak göreceli. Sabit sürücüyü dizine eklemenin performans sorununu çözüp çözmeyeceğinden emin değilim.
Solomon Rutzky

Bu beni üzüyor olsa da, bu kesinlikle başka bir komut komut dosyasının yolunu ayarlamayı veya dosyaya sabit kodlamayı içermeyen en iyi cevaptır.
QueueHammer

5

Yanlış olabilirdim, ama bunun mümkün olduğunu düşünmüyorum. Başkalarının neler yaptığını gösteren bir örnek için lütfen bu bağlantılara bakın (hiçbiri ideal değildir).

/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


Peki bu berbat, ama sanırım SSDT kullanımını teşvik ediyor.
Justin Dearing

2

Sqlcmd değişkenler dosyanızı 'C: \ Users \ alan_nt_login_name \ AppData \ Local \ Temp' klasörüne kaydetmenizi ve tüm projelerimden $ (TEMP) \ sqlcmd_variables.sql olarak göndermenizi öneririm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.