2013-03-05 109 views
1

我不能在我的项目中使用synomyms因为一些部署限制所以相反,我创造了这个观点:无效对象名

CREATE VIEW [dbo].[User] AS SELECT * FROM [PersonalData].[dbo].[User] 
GO 

它的工作确定,但现在我需要修改如下:

ALTER VIEW [dbo].[User] AS 
    SELECT [Id], 
    t.[Name] AS [Title], 
    [FirstName], 
    [LastName], 
    [JobTitle], 
    [Department], 
    [EmailAddress], 
    [PhoneNumber], 
    [PhoneExtension], 
    [MobilePhoneNumber], 
    [CreatedDate], 
    [ModifiedDate], 
    [Uid], 
    [Active] 
    FROM [PersonalData].[dbo].[User] AS u 
    LEFT OUTER JOIN [PersonalData].[dbo].[Titles] AS t ON u.TitleId = t.Id 
GO 

目前,它失败:

Ambiguous column name 'Id' 
LEFT OUTER JOIN线

但是,Microsoft SQL Management Studio中凸显[PersonalData].[dbo].[Titles]出现错误:

Invalid object name '[PersonalData].[dbo].[Titles] 

事实上,doesn't提供智能感知我该表的列。

[PersonalData].[dbo].[Titles]在那里。事实上,下面的查询返回结果没有任何错误:

select * from [PersonalData].[dbo].[Titles] 

我对SQL知识是不够深,但我不明白这是为什么,为什么它发现Users表,但doesn't找到Titles

多一点背景:

  • ,我创建视图是不是在PersonalData数据库,但在所谓的Platform其他数据库。
  • 我检查了上下文,它是好的,我在Platform数据库中创建视图。

为什么会发生?

+2

你不能使用'SELECT u。[Id] AS [id]'?看起来创建视图就是找到你的'Titles'表格就好了 – 2013-03-05 19:15:36

+0

@MattBusche如果你添加一些细节,我认为你应该把它作为这个问题的答案。 – 2013-03-05 19:16:51

+0

@MattBusche:这是答案(我的耻辱)。请回答,我会接受它。谢谢 – lontivero 2013-03-05 19:18:50

回答

3

您需要将表名添加到您的[id]字段中。因为该字段在两个表中,所以它被认为是不明确的(视图不知道从哪个表中获取)。

SELECT u.[Id] AS [id] 
1

尝试

ALTER VIEW [dbo].[User] AS 
    SELECT u.[Id], 

看来,无论您的用户表和您的标题多部未华有一个名为“ID”列。它告诉你它不知道你的SELECT列表中的Id列是什么意思。

2

智能感知问题是外设,它可能是因为:

  1. 以前的语法错误(你需要告诉SQL服务器Id你的意思是它,因为它在两个表中存在)或
  2. 您的本地智能感知缓存已过时。可以通过发出Ctrl键 + + - [R或使用Edit > IntelliSense > Refresh Local Cache(,并根据该网络连接到服务器上,等待秒或甚至几分钟)解决此问题。

这就是说,我会建议两个转变,一个认真,一个只是一个最佳实践:

  1. 不要将其命名列Id。这个名字完全没有意义。这是一个UserID?好的,无论它在模式中出现在什么地方,都可以称它为UserID
  2. 正确地在您的查询中为全部加上前缀,而不仅仅是那些具有名称冲突的列。这使得您的查询更易于理解,并防止人们不得不手动确定列来自哪个表。