SQLCMD, переменные командной строки и скрипт: setvar - PullRequest
18 голосов
/ 07 мая 2009

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

, например

С учетом следующего сценария SQL:

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

И командная строка:

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

Я ожидаю, что результат будет:

Пакетный скрипт

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

SQL-скрипт

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

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

Ответы [ 5 ]

18 голосов
/ 07 мая 2009

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

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

7 голосов
/ 25 февраля 2011

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

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

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

Когда я выполняю следующий скрипт msdeploy, значения параметров, которые я передаю через командную строку, имеют приоритет над значениями, определенными в файле скрипта (не обращайте внимания на пользователя 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"
4 голосов
/ 02 октября 2014

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

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>

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

3 голосов
/ 18 июля 2012

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

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

:r path\sqlConfig.sql
1 голос
/ 29 августа 2009

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

...