2009-05-07 4 views
16

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

например.

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

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

ответ

17

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

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

+5

Это отстой! Спасибо – VirtualStaticVoid

+4

Это действительно отстой! Я заметил, что предложение о Microsoft Connect было открыто в 2008 году, и оно по-прежнему активно. Ну, я проголосовал за это в любом случае, хотя мои надежды не очень высоки. –

+0

http://www.codeproject.com/Articles/1019661/Powershell-Scripts-to-Replace-setvar-Variable-in-S – Kody

1

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

7

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

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

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

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

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

+0

Это было действительно полезно. В моей сборке CI я добавил '/ p: CommentOutSetVarDeclarations = True' в команде msbuild, и оттуда проблема с приоритетом больше не проблема. –

Смежные вопросы