Как получить относительный путь к файлу в режиме SQLCMD в SSMS? - PullRequest
14 голосов
/ 06 января 2012

У меня есть приведенный ниже главный скрипт, который создает таблицы, вставляет некоторые данные, а затем создает хранимые процедуры.

--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"

Чего мне не хватает?


Редактировать По предложению Джейсона я попробовал это, но все равно получаю ту же ошибку:

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

Ответы [ 6 ]

25 голосов
/ 06 января 2012

Вы можете обойти это, используя опцию 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

Это поможет обойти проблему сценария.не запускается из каталога, откуда был вызван первый скрипт SQL.

5 голосов
/ 28 октября 2013

Я понимаю, что это довольно старая версия, но я заметил ошибку в вашем отредактированном коде: вам нужно включить обратную косую черту между путем и именем скрипта.

:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
4 голосов
/ 20 апреля 2012

Я обнаружил, что это будет лучшим:

:setvar path C:\"some path"

:r $(path)\myfile.sql

Вы должны ставить операторы с пробелом в кавычках, но не весь оператор. Вот почему вы можете сделать C:\"some path"

3 голосов
/ 06 февраля 2015

Получение относительного пути в SSMS не так просто, так как вы не выполняете сценарий; SSMS загрузила скрипт в память и выполняет его текст. Таким образом, текущий каталог / папка является начальной папкой процесса по умолчанию. Вы можете убедиться в этом, запустив в SSMS в режиме SQLCMD следующее:

!! PWD

Тем не менее, я нашел своего рода способ сделать это. Я признаю, что это не самый идеальный способ сделать это, однако в настоящее время кажется, что это единственный способ получить истинный относительный путь (учитывая, что установка пути в переменной не действительно "относительный" сам по себе).

Итак, что вы можете сделать:

  1. Выполните команду DOS, чтобы найти todo_master.sql и сохранить путь к этому файлу в текстовом файле в папке, которую вы можете получить из SSMS, либо потому, что это жестко заданный путь, либо потому, что он использует переменную среды, доступную как для команды DOS, так и для режима SQLCMD в SSMS
  2. При сохранении пути в этом файле сохраните его как команду режима SQLCMD, которая устанавливает переменную для этого пути
  3. Импортируйте этот текстовый файл в 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 . Если более одного файла имеет это имя, последним найденным будет путь, заданный в lative_path.txt file

  • Выполнение CD C:\ начнется с корня диска C: . Это, вероятно, не самое эффективное место для начала. Если у вас обычно есть файлы SQL в такой области, как C: \ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects , просто измените команду CD, чтобы приблизиться к месту назначения, например как:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...
    
0 голосов
/ 19 мая 2016

Используйте пакетный файл в качестве помощника.

Измените 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
0 голосов
/ 23 февраля 2016

У меня была такая же проблема, и я надеюсь, что я не утверждаю очевидное - почему бы не открыть экземпляр 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
...