Получить относительный путь в SSMS не так просто, так как вы не выполняете сценарий; SSMS загрузила скрипт в память и выполняет его текст. Таким образом, текущий каталог / папка является начальной папкой процесса по умолчанию. Вы можете убедиться в этом, запустив в SSMS в режиме SQLCMD следующее:
!! PWD
Тем не менее, я нашел своего рода способ сделать это. Я признаю, что это не самый идеальный способ сделать это, однако в настоящее время кажется, что это единственный способ получить истинный относительный путь (учитывая, что установка пути в переменной на самом деле не является «относительной») ).
Итак, что вы можете сделать, это:
- Выполните команду DOS, чтобы найти foo.sql и сохранить путь к этому файлу в текстовом файле в папке, которую вы можете получить из SSMS, либо потому, что это жестко заданный путь, либо потому, что он использует переменную среды, доступную для и команда DOS, и режим SQLCMD в SSMS
- При сохранении пути в этом файле сохраните его как команду режима SQLCMD, которая устанавливает переменную в этот путь
- Импортируйте этот текстовый файл в SSMS с помощью,
: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
Заметки:
Приведенный выше метод предполагает, что только один файл в системе называется foo.sql . Если более чем один файл имеет это имя, последний найденному будет набором пути в relative_path.txt файл
Выполнение CD C:\
начнется в корне диска C : . Вероятно, это не самое эффективное место для начала. Если у вас обычно есть файлы SQL в такой области, как C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , просто измените CD
команду, чтобы приблизиться к месту назначения, например:
!! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...