Как получить относительный путь файла в режиме SQLCMD в SSMS?
У меня есть следующий мастер script, который создает таблицы и вставляет некоторые данные, а затем создает хранимые процедуры.
--todo_master.sql
use master
go
:r todo_create_ddl.sql
:r todo_create_dml.sql
:r todo_create_sprocs.sql
go
Однако, хотя todo_master.sql находится на том же пути, что и остальные три скрипта, он не может найти эти три скрипта.
Я получаю следующую ошибку:
A fatal scripting error occurred.
The file specified for :r command was not found.
Если я предоставил полный путь, как показано ниже, эти файлы будут найдены и выполняются по назначению.
"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"
Что я могу потерять?
Edit
Как предложил Джейсон, я пробовал это, но все равно получаю ту же ошибку:
use master
go
:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects"
:setvar ddl "todo_create_ddl.sql"
:setvar dml "todo_create_dml.sql"
:setvar sprocs "todo_create_sprocs.sql"
:r $(path)$(ddl)
:r $(path)$(dml)
:r $(path)$(sprocs)
go
Ответы
Ответ 1
Вы можете обойти это, используя параметр sqlcmd setvar
, чтобы назначить путь к переменной. Затем используйте эту переменную в своем вызове :r
, например:
:setvar path "c:\some path"
:r $(path)\myfile.sql
В этой ссылке есть более подробный пример:
http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/
С помощью этого вы можете удалить строку setvar и передать это из командной строки с помощью:
Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath
Это будет связано с тем, что проблема script не выполняется из каталога, из которого был вызван первый SQL script.
Ответ 2
Я понимаю, что это довольно старый, но я заметил ошибку в вашем Редактированном коде: вам нужно включить обратную косую черту между контуром и именем script.
:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
Ответ 3
Я нашел, что это было бы лучше:
:setvar path C:\"some path"
:r $(path)\myfile.sql
Вы должны поставить выражения с пробелом в кавычки, но не весь оператор. Вот почему вы можете сделать C:\"some path"
Ответ 4
Получение относительного пути в SSMS не так прямолинейно, поскольку вы не выполняете script; SSMS загрузил script в память и выполняет свой текст. Таким образом, текущая директория/папка - это начальная папка процесса процесса по умолчанию. Вы можете увидеть это, запустив следующее в режиме SQLCMD в SSMS:
!! PWD
Однако, я нашел какой-то способ для этого. Я признаю, что это не самый идеальный способ сделать это, однако в настоящее время это единственный способ получить истинный относительный путь (учитывая, что установка пути в переменной не является действительно "относительной" как таковой).
Итак, что вы можете сделать:
- Выполните команду DOS, чтобы найти todo_master.sql и сохраните путь к этому файлу в текстовом файле в папке, которую вы можете получить из SSMS, либо потому, что это жестко закодированный путь, либо потому что он использует переменную среды, доступную как для команды DOS, так и для режима SQLCMD в SSMS.
- При сохранении пути в этом файле сохраните его как команду режима SQLCMD, которая устанавливает переменную в этот путь
- Импортируйте этот текстовый файл в SSMS с помощью
:r
, и он установит эту переменную на нужный путь
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S todo_master.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt
:r $(TEMP)\relative_path.txt
:r $(mypath)\todo_create_ddl.sql
GO
:r $(mypath)\todo_create_dml.sql
GO
:r $(mypath)\todo_create_sprocs.sql
GO
Примечания:
-
Вышеупомянутый метод предполагает, что только 1 файл в системе называется todo_master.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 ...
Ответ 5
У меня была одна и та же проблема, и я надеюсь, что не буду заявлять очевидного - почему бы не открыть экземпляр Dos/Cmd или PowerShell, cd
в каталог, содержащий скрипты, а затем загрузить Management Studio?
У меня есть этот псевдоним в моей настройке PowerShell (ваш путь может отличаться):
Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe"
Затем я cd
в папку, содержащую файл решения, затем я делаю
Ssms mysolution.ssmssln
Ответ 6
Используйте пакетный файл в качестве помощника.
Измените todo_master.sql, чтобы использовать переменную среды с именем mypath
:
use master
go
:r $(mypath)\todo_create_ddl.sql
:r $(mypath)\todo_create_dml.sql
:r $(mypath)\todo_create_sprocs.sql
go
И в вашем пакетном файле todo_master.bat
/* set the environment variable to the current directory */
SET mypath=%cd%
/* run your sql command */
sqlcmd -i todo_master.sql