运行SQLCMD.exe并为脚本变量提供命令行参数时,我希望命令行上提供的值将覆盖SQL脚本文件中定义的值。
e.g。
给出以下SQL脚本:
:setvar XXX "SQL script"
print '$(XXX)'
命令行:
sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"
我希望输出为:
批处理脚本
然而输出是:
SQL脚本
这是意图,还是必须删除SQL脚本中的:setvar
语句?
我在脚本中提供了:setvar
语句,因此我可以使用SQLCMD模式在SQL Management Studio中编辑/测试脚本,但是在我的测试和生产环境中从命令行运行脚本。
答案 0 :(得分:18)
这似乎是设计上的;有人已经在Connect上提出了更改请求: http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=382007
我能看到的唯一解决问题的方法是在发布时注释掉(或以其他方式删除):setvar
命令。
答案 1 :(得分:7)
我也在努力解决这个问题,但我记得我注意到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"
答案 2 :(得分:4)
尝试编辑sqlproj文件并添加以下属性
<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>
生成的sql文件将注释掉setvars,然后您可以使用命令行设置实际值。
答案 3 :(得分:3)
考虑对你的setvars使用:r filename
命令。
作为一个单独的文件,您可以在部署区域中使用相同的文件名,每个区域都包含自己的区域特定内容。
:r path\sqlConfig.sql
答案 4 :(得分:1)
我认为这是故意的。目前,.sql脚本中的setvar语句具有最高优先级。