完全限定名称与美元符号在SSDT项目中

时间:2014-12-07 22:16:36

标签: tsql visual-studio-2012 sql-server-data-tools

我正在研究一个tsql项目,我注意到现有的代码使用了我以前从未见过的语法。他们在数据库名称前面放了一个美元符号作为完全限定的地址。

以下是一个例子:

SELECT  c.AccountCode, FROM **[$(SmartAdmin)]**.dbo.Customers c

enter image description here

如果我将数据库名称重命名为SmartAdmin.dbo.Customers,则Visual Studio会抛出错误,说明"包含对象的未解析引用"。

它似乎是与Visual Studio相关的东西,任何人都可以解释这是什么和 我是否可以删除它。

请参阅随附的屏幕截图,最后一个来自项目解决方案文件。

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:5)

在SSDT项目中使用[$(SmartAdmin)]语法来引用其他数据库中的对象。确切地说,它是SQLCMD语法。

如果您有SmartAdmin的数据库引用,并且如果设置了引用以便[$(SmartAdmin)]正确引用它,那么这不是问题。看起来问题是[SmartAdmin]的其他两个引用。将它们更改为[$(SmartAdmin)].dbo.whatever


这些引用有用的原因示例:我刚编辑了一个我在SSDT中的存储过程来拼错列名。在几秒钟内,列名称以红色下划线。然后我删除了依赖于列名的数据库引用。红色下划线消失了。我重新添加了数据库引用,并再次用红色下划线列。我更正了列名,红色下划线消失了。

如果没有数据库引用,我将不得不等到部署或可能执行存储过程才能看到错误。通过数据库引用,我在编辑器中找到了的问题。就像代码一样。

答案 1 :(得分:0)

在我看来,您的数据库实际上名为$(SmartAdmin)

由于错误提示"contains an unresolved reference to an object".,这意味着当您将数据库名称更改为SmartAdmin时,它无法在服务器上找到具有此名称的数据库。

如果要更改数据库名称,则需要执行以下语句,然后才能在语句中使用该名称。

USE master;
GO

EXEC sp_renamedb '$(SmartAdmin)', 'SmartAdmin';
GO

USE SmartAdmin;  --<-- Now you will be able to connect to this database
GO                 -- without the dollar ($) sign. 

答案 2 :(得分:0)

此问题与数据库项目外部数据库引用有关。当您向数据库项目添加另一个解决方案时,您可以指定&#34;数据库变量名称&#34;在我的情况下,它是$(SmartAdmin)。

有关详细信息,请参阅此linkenter image description here

感谢大家回答我的问题。