gpt4 book ai didi

sql - sql View 中的对象名称无效

转载 作者:行者123 更新时间:2023-12-02 07:04:09 25 4
gpt4 key购买 nike

由于一些部署限制,我不能在我的项目中使用同义词,所以我创建了这个 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 问题是外围的,可能是因为:

  1. 先前的语法错误(您需要告诉 SQL Server 您指的是哪个 Id,因为它存在于两个表中),或者
  2. 您的本地 IntelliSense 缓存已过时。您可以通过发出 Ctrl+Shift+R 或使用 Edit > IntelliSense > Refresh Local Cache(和,取决于与服务器的网络连接,等待数秒甚至数分钟)。

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

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

关于sql - sql View 中的对象名称无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com