Tsql 如何使用SQLCMD变量定义表名?

Tsql 如何使用SQLCMD变量定义表名?,tsql,visual-studio-2013,sql-server-data-tools,Tsql,Visual Studio 2013,Sql Server Data Tools,所以,在VisualStudio2013上使用SSDT,我可以指定一个数据库名称 create view vSample1 as select * from [$(RandomDatabase)].dbo.TableName 我也可以用一个由四个部分组成的名字来做这件事 create view vSample2 as select * from [$(RandomServer)].[$(RandomDatabase)].dbo.TableName 但是,当我尝试使用表名执行此操作时,会出

所以,在VisualStudio2013上使用SSDT,我可以指定一个数据库名称

create view vSample1 as 
select * from [$(RandomDatabase)].dbo.TableName
我也可以用一个由四个部分组成的名字来做这件事

create view vSample2 as 
select * from [$(RandomServer)].[$(RandomDatabase)].dbo.TableName
但是,当我尝试使用表名执行此操作时,会出现错误

create view vSample3
select * from [$(RandomServer)].[$(RandomDatabase)].dbo.[$(RandomTable)]
这给了我一个类似的错误

Error:  SQL71561: View: [vSample3] has an unresolved reference to object [$(RandomServer)].[$(RandomDatabase)].dbo.[$(RandomTable)].
我一直在查看项目设置中的SQLCMD variables窗口,并验证了$(RandomTable)变量定义为TableName,但它仍然会给我生成错误

为什么会这样,我该如何修复它


谢谢

我会使用同义词-创建一个与实际表匹配的表,并创建一个指向该表的同义词,然后在视图中引用同义词,或者只是引用而不是视图。你需要这个,所以你可以编译它,你可以得到好的东西,比如引用等等

然后,当您部署到每个服务器时,只需将正确的同义词部署到正确的服务器


(那么,对于这样一个恼人的系统,就把你的供应商踢进b&DD$)

我会使用部署前/部署后脚本,使用sp_executesql和动态查询创建这样的视图

exec sp_executesql N'create view vSample3 as
select * from [$(RandomServer)].[$(RandomDatabase)].dbo.[$(RandomTable)]'

出于兴趣,为什么需要随机表名?你考虑过使用同义词吗?@EdElliott我们的一个供应商有一个产品,我们已经将其部署到四个不同的环境中。该产品具有非确定性生成的模式。。。在一个环境中,该表可能命名为[KeyType124],而在另一个环境中,它可能命名为[KeyType133]。我希望通过使用SSDT生成一组查询来简化每个环境中的数据库查询,这些查询可以以视图的形式部署到该环境中。那么你只需要记住vNames或vaddress而不是KeyType133。这不是有同样的问题吗?下面的语句仍然得到一个关于[$(随机表)]未解决的类似错误:为[$(随机服务器)][$(随机数据库)].dbo创建同义词Sample3。[$(随机表)]只是为了澄清,我希望此解决方案与SSDT集成,并且我也不能修改供应商的数据库(它在EULA中),因此,我需要能够使用一个变量来部署view/synonym/whatever。是的,因此在ssdt中创建一个同义词和一个伪表,该表与实际表具有相同的定义-然后在部署时,将synoym更改为指向实际表(在每个数据库中不同)。如果你在SSDT中没有一个表,它将无法计算出定义等(比如列)-你不需要部署假表我很感激你的建议,但在这一点上,你似乎是在给大象化妆。我不想通过在数据库中创建额外的对象来解决这个问题(听起来我只需要在开发环境中使用的对象)。。。我想让变量工作。如果这是我唯一的选择,那是一件事,但我更愿意知道我需要做什么才能让SSDT基于SQLCMD变量识别表,就像它对数据库和服务器所做的一样。你使用SSDT做什么?我之所以这么问,是因为其中一个主要好处是在编译时验证代码是否正确——如果使用指向不存在表的变量,则无法验证代码是否正确。你也有一个非常独特的环境,所以它不会是直截了当的!在我的开发环境中,我将有一个变量指向KeyItem123,在那里它是正确的。当我将dacpac部署到qa环境中时,我将使用sqlpackage/variables:RandomTable=KeyItem324(或其他什么)来部署它。是的,验证和重构只是我想使用SSDT的一些原因。SSDT然后会将该字符串视为字符串而不是sql语句:然后它不会对其运行验证或重构。只要尝试一下,它就会工作,尽管它不会被验证。恐怕您不能在正在编译/构建的脚本中使用变量。