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

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

由于一些部署限制,我不能在我的项目中使用同义词,所以我创建了这个 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/

相关文章:

SQL 逆透视和插入

mysql - 分组依据、拥有和计数

sql - 在T-SQL中,如何插入默认设置为所有值的新行?

mysql - 在 MySQL 中使用 CREATE TABLE 语句时,列属性必须按什么顺序输入?

sql-server - 没有 TempTable 的 T-SQL SELECT 随机 varchar 值

sql-server - 如何在不使用 GO 的情况下强制 sql server 一次执行一个命令?

sql - 过程或功能!指定的参数太多

mysql - 多过滤器mysql

sql-server - 如何在 SQL Server 中将输出参数与其他列名称一起使用

sql - 获取 SQL 字符串中的父路径