Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql视图中的对象名称无效_Sql_Sql Server_Sql Server 2008_Sql View - Fatal编程技术网

sql视图中的对象名称无效

sql视图中的对象名称无效,sql,sql-server,sql-server-2008,sql-view,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],

由于某些部署限制,我无法在项目中使用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'
左侧外部联接中

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

Invalid object name '[PersonalData].[dbo].[Titles]
事实上,它没有为该表的列提供IntelliSense

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

select * from [PersonalData].[dbo].[Titles]
我对SQL的了解不够深入,但我不明白为什么会这样,为什么它会找到
用户
表,但却找不到
标题

更详细一点:

  • 我创建的视图不在
    PersonalData
    数据库中,而是在另一个名为
    平台的数据库中
  • 我检查了上下文,一切正常,我正在
    Platform
    数据库中创建视图
为什么会发生这种情况?

试试看

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

似乎用户表和标题表都有一个名为“Id”的列。它告诉您,它不知道您在选择列列表中指的是哪个Id列。

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


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

  • 前面的语法错误(您需要告诉SQL Server您指的是哪个
    Id
    ,因为它存在于两个表中),或者
  • 您的本地IntelliSense缓存已过时。您可以通过发出Ctrl+Shift+R或使用
    Edit>IntelliSense>Refresh Local Cache
    (以及根据与服务器的网络连接,等待几秒钟甚至几分钟)来修复此问题
  • 也就是说,我建议进行两项改革,一项是认真的,另一项只是最佳做法:

  • 不要命名列
    Id
    。这个名字毫无意义。它是一个
    用户ID
    ?好的,无论它出现在模式中的什么地方,都可以称它为
    UserID
  • 正确地为查询中的所有列添加前缀,而不仅仅是那些名称冲突的列。这使您的查询更容易理解,并防止人们不得不手动确定列来自哪个表

  • 您不能使用
    选择u.[Id]作为[Id]
    ?创建视图似乎只是在查找
    标题
    表fine@MattBusche如果你能补充一点细节,我想你应该把它作为这个问题的答案。@MattBusche:这就是答案(我感到羞耻)。请回答,我会接受的。Thanks@MattBusche-在我发布我的答案之前,我没有看到你的评论。请作为答案发布,这样您就可以获得信用。@lontivero谢谢,我在下面发布了answe
    SELECT u.[Id] AS [id]