SQLCMD,命令行变量和脚本:setvar

Vir*_*oid 18 sql-server sql-server-2005 sqlcmd

运行SQLCMD.exe并为脚本变量提供命令行参数时,我希望命令行上提供的值将覆盖SQL脚本文件中定义的值.

例如

给出以下SQL脚本:

:setvar XXX "SQL script"
print '$(XXX)'
Run Code Online (Sandbox Code Playgroud)

和命令行:

sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

批处理脚本

但输出是:

SQL脚本

这是意图,还是必须:setvar删除SQL脚本中的语句?

:setvar在脚本中提供了语句,因此我可以使用SQLCMD模式在SQL Management Studio中编辑/测试脚本,但是在我的测试和生产环境中从命令行运行脚本.

Ed *_*per 18

这似乎是设计上的; 有人已经在Connect上提出了更改请求:http: //connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeededID = 382007

解决这个问题的唯一方法就是在发布时注释掉(或以其他方式删除):setvar命令.

  • 太糟糕了!谢谢 (6认同)
  • 真的很糟糕!我注意到Microsoft Connect上的建议是在2008年开放的,它仍处于活动状态.好吧,无论如何,我投了票,虽然我的希望不是很高. (5认同)

Mic*_*lvR 7

我也在努力解决这个问题,但我记得我注意到msdeploy.exe也可以用变量执行sql脚本.但是,由于一些奇怪的原因,msdeploy.exe能够从命令行传递变量,命令行中的变量值优先于脚本本身定义的值.

一个例子:我有一个sql脚本(NavDbSecurity.sql),它定义了三个参数:

:setvar loginName "testLoginName"
:setvar databaseName "testDatabaseName"
:setvar NavCompanyName "blablabla"
Run Code Online (Sandbox Code Playgroud)

当我执行以下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"
Run Code Online (Sandbox Code Playgroud)


Gop*_*nan 7

尝试编辑 sqlproj 文件并添加以下属性

<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>
Run Code Online (Sandbox Code Playgroud)

生成的 sql 文件将注释掉 setvars,然后您可以使用命令行来设置实际值。