Отримати відносний шлях у SSMS - це не так просто, оскільки ви не виконуєте сценарій; SSMS завантажив скрипт у пам'ять і виконує його текст. Таким чином, поточний каталог / папка є початковою папкою запуску процесу за замовчуванням. Це можна побачити, виконавши в режимі SQLCMD в SSMS наступне:
!! 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
Примітки:
Вищеописаний метод передбачає, що лише 1 файл у системі називається 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 ...