sql 视图中的对象名称无效

lon*_*ero 2 sql sql-server sql-server-2008 sql-view

由于某些部署限制,我无法在我的项目中使用同义词,因此我创建了以下视图:

CREATE VIEW [dbo].[User] AS SELECT * FROM [PersonalData].[dbo].[User] 
GO
Run Code Online (Sandbox Code Playgroud)

它工作正常,但现在我需要按如下方式修改它:

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
Run Code Online (Sandbox Code Playgroud)

目前,它失败了:

Ambiguous column name 'Id'
Run Code Online (Sandbox Code Playgroud)

LEFT OUTER JOIN行。

但是,Microsoft SQL Management Studio 突出显示[PersonalData].[dbo].[Titles]错误:

Invalid object name '[PersonalData].[dbo].[Titles]
Run Code Online (Sandbox Code Playgroud)

事实上,它没有为我提供该表列的智能感知。

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

select * from [PersonalData].[dbo].[Titles]
Run Code Online (Sandbox Code Playgroud)

我对 SQL 的了解不够深入,但我不明白为什么会这样,为什么它找到Userstable 但没有找到Titles.

多一点上下文:

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

为什么会发生?

Aar*_*and 5

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

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

也就是说,我建议进行两项更改,一项是认真的,一项只是最佳实践:

  1. 不要命名列Id。这个名字完全没有意义。是UserID吗?好的,UserID在模式中出现的任何地方都可以调用它。
  2. 正确地为查询中的所有列添加前缀,而不仅仅是那些有名称冲突的列。这使您的查询更容易理解,并防止人们不得不手动找出列来自哪个表。