Подтвердить что ты не робот

Как получить относительный путь файла в режиме 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
4b9b3361

Ответ 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