【问题标题】:SQLCMD, command-line variables and script :setvarSQLCMD,命令行变量和脚本:setvar
【发布时间】:2009-05-07 09:26:36
【问题描述】:

当运行 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 脚本

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

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

【问题讨论】:

    标签: sql-server sql-server-2005 sqlcmd


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    我也在为此苦苦挣扎,但我记得我注意到 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"
    

    【讨论】:

      【解决方案3】:

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

      <CommentOutSetVarDeclarations>true</CommentOutSetVarDeclarations>
      

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

      【讨论】:

      • 这真的很有帮助,在我的 CI 构建中,我已将 /p:CommentOutSetVarDeclarations=True 添加到 msbuild 命令中,从此优先级问题不再存在。
      【解决方案4】:

      考虑为您的 setvars 使用 :r filename 命令。

      作为一个单独的文件,您可以在您的部署区域中使用相同的文件名,每个部署区域都包含自己的区域特定内容。

      :r path\sqlConfig.sql
      

      【讨论】:

        【解决方案5】:

        我认为这是故意的。目前 .sql 脚本中的 setvar 语句具有最高优先级。

        【讨论】:

          猜你喜欢
          • 2020-06-15
          • 2023-03-20
          • 2023-04-09
          • 2014-07-26
          • 2015-04-24
          • 2011-03-29
          • 2015-12-07
          • 2010-11-01
          • 1970-01-01
          相关资源
          最近更新 更多