我们有一个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脚本中干预此生成的输出。 (在吗?)
我可以使用另一种方法吗?
答案 0 :(得分:1)
我知道这个问题,无论我怎么想,我都找不到解决问题的优雅方法。您的选择基本上是:
亲自看看哪种方法更容易或更容易接受。
答案 1 :(得分:0)
您是否考虑过使用一行
来创建部署前脚本,而不是手动编辑?:r $(theconfig)
?
而 $(theconfig)
将是一个包含 :setvar
命令列表的文件,例如
:setvar $(otherdb) "otherserver].[otherdb].[schema"
由于 UI 没有注入变量,您可以提供带有 ]
的值,这些值不会加倍,以便 [$(somevar)]
格式正常工作。
最后,$(theconfig)
可以在发布配置文件中设置为多个环境的多个配置(每个配置都有自己的配置文件)。