Як змусити SSMS використовувати відносний шлях поточного сценарію з: r в режимі sqlcmd, як це робить SSDT?


11

Якщо у мене в одній папці foo.sql і bar.sql, foo.sql може посилатися на bar.sql при запуску з SSDT в режимі sqlcmd з :r ".\bar.sql". Однак SSMS його не знайде. Прокмон показує, що SSMS шукає %systemroot%\syswow64:

Повідомлення про скріншот Procmon

Як сказати SSMS шукати в папці, до якої зберігається поточний скрипт, не чітко оголошуючи шлях?

Відповіді:


8

Отримати відносний шлях у SSMS - це не так просто, оскільки ви не виконуєте сценарій; SSMS завантажив скрипт у пам'ять і виконує його текст. Таким чином, поточний каталог / папка є початковою папкою запуску процесу за замовчуванням. Це можна побачити, виконавши в режимі SQLCMD в SSMS наступне:

!! PWD

Однак я знайшов своєрідний спосіб зробити це. Я визнаю, що це не найідеальніший спосіб зробити це, однак, наразі, здається, це єдиний спосіб отримати справжній відносний шлях (враховуючи, що встановлення шляху в змінній насправді не є "відносним" саме по собі ).

Отже, що ви можете зробити:

  1. Виконайте команду DOS, щоб знайти foo.sql і зберегти шлях до цього файлу в текстовому файлі в папці, яку ви можете отримати з SSMS, або тому, що це жорстко закодований шлях, або тому, що він використовує змінну середовища, доступну для як команда DOS, так і режим SQLCMD в SSMS
  2. Зберігаючи шлях у цьому файлі, зберігайте його як команду режиму SQLCMD, яка встановлює змінну цього шляху
  3. Імпортуйте цей текстовий файл у 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 ...

Це креативно, але повільно та дисково.
Justin Dearing

2
@JustinDearing Як ​​я вже говорив у своїй відповіді, це: а) неідеальний, і б) повільний, починаючи з кореневого каталогу, але в) єдиний спосіб, коли я бачу зробити це технічно відносно. Я не впевнений, якщо індексація жорсткого диска усуне проблему з продуктивністю.
Соломон Руцький

Хоча це мене сумно, це, безумовно, найкраща відповідь, яка не передбачає встановлення шляху з іншого сценарію команди або жорсткого кодування його у файл.
QueueHammer

5

Я можу помилитися, але не думаю, що це можливо. Перегляньте ці посилання для прикладу того, що зробили інші (жодне не є ідеальним).

/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


Ну добре, що смокче, але я думаю, це заохочує використання SSDT.
Джастін Діргінг

2

Я рекомендую зберегти ваш файл змінних sqlcmd у "C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp" та посилати його на всі мої проекти як $ (TEMP) \ sqlcmd_variables.sql.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.