2014-12-07 67 views
1

我正在开发一个tsql项目,并且我注意到现有的代码使用了我以前从未见过的语法。他们在完全合格的地址的数据库名称前放了一个美元符号。在SSDT项目中使用美元符号的完全限定名称

下面是一个例子:

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

+0

对我来说似乎[很无聊](http://stackoverflow.com/q/3551284/11683)。 – GSerg 2014-12-07 22:20:47

+0

那么,如果我没有解决这个问题,我的数据库项目将无法建立,我无法登记。所以,这对我来说并不无聊。谢谢 – 2014-12-07 22:21:55

+2

去sql服务器并执行'选择*从sys.databases',看看你的数据库是否真的叫'$(SmartAdmin)'。 – 2014-12-07 22:24:27

回答

4

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

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


为什么这些引用是有用的示例:我刚刚编辑了一个存储过程,我在SSDT中拼写错误列名。在几秒钟内,列名以红色下划线。然后我删除了依赖于列名的数据库引用。红色的下划线消失了。我添加了数据库引用,并且该列再次以红色标出。我更正了列名,红色下划线消失了。

没有数据库引用,我不得不等待存储过程被部署或可能执行,才能看到错误。通过参考数据库,我发现编辑中的问题。就像代码一样。

+0

嗨,约翰,非常感谢你的解决方案!你知道我应该在Visual Studio中去改变这个参考吗?我想将它称为[SmartAdmin]而不是[$(SmartAdmin)]。谢谢。 – 2014-12-07 23:46:39

+0

你不能那样改变它。 '[$()]'是语法,而不是命名。如果您不将这些外部引用切换到'[$(x)]'语法,您将失去SSDT中的一些最佳功能。例如,SSDT不会知道'sp。[PerSms]'和'spo。[PerSms]'的数据类型,所以它不能警告你不一致地使用视图的'PerSms'列。这很丑陋,但一旦你习惯了它,你会看到好处。一旦你建立了项目,开始开启代码分析,你会发现你从未想象到的问题。 – 2014-12-08 03:57:08

+0

您也可以通过变量名称将数据库引用更改为NOT引用。编辑你的数据库引用的属性来做到这一点,然后引用你通常的方式。 – 2014-12-08 17:07:19

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. 
+0

Hi M.Ali。非常感谢您的回答。但是,该数据库名为SmartAdmin,不含$()。问候, – 2014-12-07 22:35:30

0

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

有关更多信息,请参阅此linkenter image description here

谢谢大家回答我的问题。