由于一些部署限制,我不能在我的项目中使用同义词,所以我创建了这个 View :
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
。
更多背景信息:
- 我正在创建的 View 不在
PersonalData
数据库中,而是在另一个名为Platform
的数据库中。 - 我检查了上下文,没问题,我正在
Platform
数据库中创建 View 。
为什么会这样?
最佳答案
IntelliSense 问题是外围的,可能是因为:
- 先前的语法错误(您需要告诉 SQL Server 您指的是哪个
Id
,因为它存在于两个表中),或者 - 您的本地 IntelliSense 缓存已过时。您可以通过发出 Ctrl+Shift+R 或使用
Edit > IntelliSense > Refresh Local Cache
(和,取决于与服务器的网络连接,等待数秒甚至数分钟)。
也就是说,我建议进行两项更改,一项是认真的更改,一项只是最佳实践:
- 不要命名列
Id
。这个名字完全没有意义。它是UserID
吗?好的,将它命名为UserID
在架构中出现的任何位置。 - 正确地为查询中的所有 列添加前缀,而不仅仅是名称冲突的列。这使您的查询更易于理解,并避免人们不得不手动找出列来自哪个表。
关于sql - sql View 中的对象名称无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232137/