我可以在Visual Studio数据库项目中应用的sqlcmd变量中使用完全限定的对象名称吗?

时间:2018-09-27 22:14:45

标签: sql-server visual-studio sqlcmd

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

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

这在链接服务器的SQL中起作用,并手动执行实际查询,但似乎不适用于基于sqlcmd-mode的部署。事实证明,方括号使输出沿[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脚本中干预此生成的输出。 (在吗?)

我可以使用另一种方法吗?

2 个答案:

答案 0 :(得分:1)

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

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

亲自看看哪种方法更容易或更容易接受。

答案 1 :(得分:0)

您是否考虑过使用一行

来创建部署前脚本,而不是手动编辑?
:r $(theconfig)

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

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

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

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