sql视图中的对象名无效

时间:2013-03-05 19:10:34

标签: sql sql-server sql-server-2008 sql-view

由于某些部署限制,我无法在项目中使用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]

事实上,它并没有为该表的列提供IntelliSense。

[PersonalData].[dbo].[Titles]就在那里。实际上,以下查询返回没有错误的结果:

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

我对SQL的了解不够深入,但我不明白为什么会这样,为什么它找到Users表却找不到Titles

更多背景信息:

  • 我正在创建的视图不在PersonalData数据库中,而是在名为Platform的其他数据库中。
  • 我检查了上下文,没关系,我正在Platform数据库中创建视图。

为什么会这样?

3 个答案:

答案 0 :(得分:3)

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

SELECT u.[Id] AS [id] 

答案 1 :(得分:3)

IntelliSense问题是外围设备,可能是因为:

  1. 以前的语法错误(你需要告诉SQL Server 你的意思是哪个 Id,因为它存在于两个表中)或
  2. 您的本地IntelliSense缓存已过时。您可以通过发出 Ctrl + Shift + R 或使用Edit > IntelliSense > Refresh Local Cache来解决此问题(并根据与服务器的网络连接) ,等待几秒甚至几分钟。)
  3. 那就是说,我会建议两个改变,一个是严肃的,一个只是一个最佳实践:

    1. 不要为列Id命名。这个名字完全没有意义。是UserID吗?好的,无论它出现在架构中的哪个位置都称之为UserID
    2. 在查询中正确添加所有列的前缀,而不仅仅是名称冲突的列。这使您的查询更容易理解,并防止人们不得不手动找出列来自哪个表。

答案 2 :(得分:1)

尝试

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

看来,您的用户表和标题标签页都有一个名为“Id”的列。它告诉你它不知道你在SELECT列列表中指的是哪个Id列。