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?

Justin Dearing
źródło

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 ...
Solomon Rutzky
źródło
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
5

Mogę się mylić, ale nie sądzę, że jest to możliwe. Zobacz te linki, aby zobaczyć przykłady tego, co zrobili inni (żadne z nich nie jest idealne).

/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

Młot SQL
źródło
No dobrze, to do bani, ale myślę, że zachęca do korzystania z SSDT.
Justin Dearing
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.

Vernon Jimmerson
źródło