首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQLCMD,命令行变量和脚本:setvar

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

Stack Overflow用户
提问于 2009-05-07 09:26:36
回答 5查看 18K关注 0票数 20

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

例如:

给定以下SQL脚本:

代码语言:javascript
复制
:setvar XXX "SQL script"
print '$(XXX)'

和命令行:

代码语言:javascript
复制
sqlcmd.exe -S <Server> -d <Database> -E -b -i <Script> -v XXX="Batch script"

我希望输出是:

批处理脚本

但是,输出结果是:

SQL脚本

这就是我们的目的,还是必须删除SQL脚本中的:setvar语句?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-07 11:01:52

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

我所能看到的解决这个问题的唯一方法就是在发布时注释掉(或者删除) :setvar命令。

票数 18
EN

Stack Overflow用户

发布于 2011-02-25 21:10:28

我也在为此而苦苦挣扎,但我记得我注意到msdeploy.exe也能够使用变量执行sql脚本。但是,由于某种奇怪的原因,msdeploy.exe能够从命令行传递变量,其中来自命令行的变量值优先于脚本本身中定义的值。

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

代码语言:javascript
复制
:setvar loginName "testLoginName"
:setvar databaseName "testDatabaseName"
:setvar NavCompanyName "blablabla"

当我执行下面的msdeploy脚本时,我通过命令行传递的参数值优先于脚本文件中定义的值(不考虑没有密码的sa用户;):

代码语言:javascript
复制
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"
票数 7
EN

Stack Overflow用户

发布于 2014-10-02 19:51:57

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

代码语言:javascript
复制
<CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/833678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档