Jak zmusić SSMS do używania ścieżki względnej bieżącego skryptu z: rw trybie sqlcmd, podobnie jak SSDT?


11

Jeśli mam foo.sql i bar.sql w tym samym folderze, foo.sql może odwoływać się do bar.sql po uruchomieniu z SSDT w trybie sqlcmd z :r ".\bar.sql". Jednak SSMS go nie znajdzie. Procmon pokazuje, że SSMS szuka %systemroot%\syswow64:

Zrzut ekranu z komentarzem Procmon

Jak powiedzieć SSMS, aby szukał w folderze, w którym zapisany jest bieżący skrypt, bez wyraźnego zadeklarowania ścieżki?

Odpowiedzi:


8

Uzyskiwanie względnej ścieżki w SSMS nie jest takie proste, ponieważ nie wykonujesz skryptu; SSMS załadował skrypt do pamięci i wykonuje jego tekst. Zatem bieżący katalog / folder jest domyślnym folderem początkowym procesu. Możesz to zobaczyć, uruchamiając następujące polecenie w trybie SQLCMD w SSMS:

!! PWD

Znalazłem jednak sposób na zrobienie tego. Przyznaję, że nie jest to najbardziej idealny sposób na zrobienie tego, jednak obecnie wydaje się, że jest to jedyny sposób na uzyskanie prawdziwej ścieżki względnej (biorąc pod uwagę, że ustawienie ścieżki w zmiennej nie jest tak naprawdę „względne” per se ).

Możesz więc:

  1. Wykonaj polecenie DOS, aby znaleźć plik foo.sql i zapisać ścieżkę do tego pliku w pliku tekstowym w folderze, który można uzyskać z SSMS, ponieważ jest to ścieżka zakodowana na stałe lub ponieważ używa zmiennej środowiskowej, która jest dostępna dla zarówno polecenie DOS, jak i tryb SQLCMD w SSMS
  2. Przechowując ścieżkę w tym pliku, zapisz ją jako polecenie trybu SQLCMD, które ustawia zmienną dla tej ścieżki
  3. Zaimportuj ten plik tekstowy do SSMS za pomocą, :ra ustawi on tę zmienną na żądaną ścieżkę
!! 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

Uwagi:

  • Powyższa metoda zakłada, że ​​tylko 1 plik w systemie nosi nazwę foo.sql . Jeśli ta nazwa ma więcej niż jeden plik, ostatni znaleziony będzie ścieżką ustawioną w pliku relative_path.txt

  • Wykonanie CD C:\rozpocznie się w katalogu głównym dysku C :. To prawdopodobnie nie jest najbardziej efektywne miejsce na rozpoczęcie. Jeśli zazwyczaj masz pliki SQL w obszarze, takim jak C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , po prostu zmień CDpolecenie, aby zbliżyć się do miejsca docelowego, na przykład:

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

To kreatywne, ale spowalnia i wymaga dużej ilości dysku.
Justin Dearing,

2
@JustinDearing Jak powiedziałem w mojej odpowiedzi, jest to: a) nieidealne ib) wolne, jeśli zaczynam od katalogu głównego, ale c) jedyny sposób, w jaki mogę to zrobić, który jest względnie techniczny . Nie jestem pewien, czy indeksowanie dysku twardego usunęłoby problem z wydajnością.
Solomon Rutzky

Chociaż to mnie zasmuca, jest to zdecydowanie najlepsza odpowiedź, która nie wymaga ustawienia ścieżki z innego skryptu poleceń ani zakodowania go na stałe w pliku.
QueueHammer


2

Polecam zapisać plik zmiennych sqlcmd w 'C: \ Users \ twoja_nazwa_logowania \ AppData \ Local \ Temp' i odwołać się do niego ze wszystkich moich projektów jako $ (TEMP) \ sqlcmd_variables.sql.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.