我正在研究一个tsql项目,我注意到现有的代码使用了我以前从未见过的语法。他们在数据库名称前面放了一个美元符号作为完全限定的地址。
以下是一个例子:
SELECT c.AccountCode, FROM **[$(SmartAdmin)]**.dbo.Customers c
如果我将数据库名称重命名为SmartAdmin.dbo.Customers,则Visual Studio会抛出错误,说明"包含对象的未解析引用"。
它似乎是与Visual Studio相关的东西,任何人都可以解释这是什么和 我是否可以删除它。
请参阅随附的屏幕截图,最后一个来自项目解决方案文件。
答案 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)。
有关详细信息,请参阅此link。
感谢大家回答我的问题。