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, но запускать сценарии из командной строки в тестовых и производственных средах.
Ответы
Ответ 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 имеет наивысший приоритет.