【问题标题】:Can I use fully qualified object names in sqlcmd variables applied in a Visual Studio Database project?我可以在 Visual Studio 数据库项目中应用的 sqlcmd 变量中使用完全限定的对象名称吗?
【发布时间】:2019-03-03 21:23:37
【问题描述】:

我们有一个数据库项目,该项目在另一个数据库的表上具有连接。由于其他数据库名称可能会更改,因此对其他数据库的引用使用 sqlcmd 变量进行引用,即我们为其设置了部署参数的inner join [$(otherdb)].Table1 ...

现在,我正在尝试使这个项目可以部署到本地 SQL Server 实例,供我们作为开发人员使用,并且我希望不必在同一台机器上部署引用的数据库。因此,我有条件地 ($(IsLocal)='true') 设置链接服务器以指向我们的开发 SQL DB 服务器,并且仅对于本地部署,我试图将 $(otherdb) 变量设置为具有:linkedserver.otherdb 而不仅仅是otherdb

这适用于带有链接服务器的 SQL 并手动执行实际查询,但似乎不适用于基于 sqlcmd 模式的部署。事实证明,方括号按照[linkedserver.otherdb].Table1(而不是[linkedserver].[otherdb].Table1)的行进行输出,如果我只是删除方括号(linkedserver.otherdb.Table1),我会收到数据库项目的构建时错误,说语法无效.所以方括号必须在那里,但完全限定的嵌套名称使其无效。

我还尝试使用linkedserver].[otherdb 的sqlcmd 变量值来生成[linkedserver].[otherdb].[Table1] 的查询。当我尝试执行 sqlcmd 时,这也适用于 SQL,但是当 Visual Studio 生成脚本时,它会添加一个额外的 ] 导致:

:setvar otherdb "linkedserver]].[otherdb"

如果我删除了额外的],它确实可以工作,但是如果没有 cmd 或 PowerShell 脚本,就无法在 T-SQL 脚本中干预这个生成的输出。 (有吗?)

我可以使用其他方法吗?

【问题讨论】:

    标签: sql-server visual-studio sqlcmd


    【解决方案1】:

    我知道这个问题,但无论我怎么想,我都无法找到一个优雅的解决方案。您的选择基本上是:

    1. 通过将空(或几乎空)的引用数据库部署到同一台服务器来完善您的 DEV 环境。一切正常,无需更改代码。
    2. 重写所有相关代码,以对引用的数据库使用 4 部分标识符。 DEV 环境可以正常工作; PROD 将需要一个指向自身的环回链接服务器,以便可以使用 4 部分名称访问引用数据库中的对象。除了其他潜在问题外,这可能会引入性能瓶颈。

    自己看看哪种方式更容易或更容易接受。

    【讨论】:

    • 谢谢。目前,我们正在解决“linkedserver].[otherdb”变量名称方法,并手动编辑生成的脚本以删除双括号。这似乎是最不迟钝的方法,在某些时候我将创建一个 powershell 脚本来生成没有 UI 的相同脚本(如构建数据库项目并打包一个针对本地环境 xml 的脚本),将脚本输出更改为删除双括号,并使用脚本针对 localhost 调用 sqlcmd.exe,只需双击即可。
    【解决方案2】:

    您是否考虑过创建一个包含一行的预部署脚本而不是手动编辑

    :r $(theconfig)
    

    ?

    $(theconfig) 将是一个包含:setvar 命令列表的文件,例如

    :setvar $(otherdb) "otherserver].[otherdb].[schema"
    

    由于 UI 没有注入变量,您可以提供不加倍的 ] 值,以便 [$(somevar)] 格式正常工作。

    最后,$(theconfig) 可以在发布配置文件中设置多个环境的多个配置(每个都有自己的配置文件)。

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多