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

SQLCMD, переменные командной строки и script: setvar

При запуске SQLCMD.exe и предоставлении аргументов командной строки для переменных сценариев я ожидаю, что значения, указанные в командной строке, переопределяют значения, определенные в файле SQL script.

например.

Учитывая следующий SQL Script:

:setvar XXX "SQL script"
print '$(XXX)'

И в командной строке:

sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"

Я ожидаю, что вывод будет:

Пакет script

Однако вывод:

SQL script

Это намерение или должны быть удалены операторы :setvar в SQL script?

Я представил операторы :setvar в script, поэтому я могу редактировать/тестировать script в SQL Management Studio в режиме SQLCMD, но запускать сценарии из командной строки в тестовых и производственных средах.

4b9b3361

Ответ 1

Это выглядит по дизайну; кто-то уже поднял запрос на изменение в Connect: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=382007

Единственный путь вокруг проблемы, которую я вижу, - это комментировать (или иначе удалять) команды :setvar в выпуске.

Ответ 2

Я тоже боролся с этим, но я помню, что заметил, что msdeploy.exe также может выполнять sql-скрипты с переменными. Но, по какой-то странной причине, msdeploy.exe может передавать переменные из командной строки с значениями переменных из командной строки, имеющими приоритет над значениями, определенными самим script.

Пример: У меня есть sql script (NavDbSecurity.sql), который имеет три параметра:

:setvar loginName "testLoginName"
:setvar databaseName "testDatabaseName"
:setvar NavCompanyName "blablabla"

Когда я выполняю следующий msdeploy script, значения параметров, которые я передаю в командной строке, имеют приоритет над значениями, определенными в файле script (не против пользователя sa без пароля;)):

msdeploy.exe -verb:sync -source:dbfullsql="c:\NavDbSecurity.sql" -dest:dbfullsql="data source=.\sqlexpress;initial catalog=data base;User Id=sa;Password=;",transacted=False -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=databaseName,value="[data base]" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=loginName,value="domain\user" -setParam:kind=SqlCommandVariable,scope="NavDbSecurity.sql",match=NavCompanyName,value="testCompany"

Ответ 3

Рассмотрим использование команды :r filename для ваших setvars.

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

:r path\sqlConfig.sql

Ответ 4

Попробуйте отредактировать файл sqlproj и добавьте следующее свойство

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>

Сгенерированный sql файл будет занесен в setvars, и вы сможете использовать командную строку для установки фактического значения.

Ответ 5

Я думаю, что это намеренно. в настоящее время оператор setvar в .sql script имеет наивысший приоритет.