2013-03-05 7 views
1

Я не могу использовать synomyms в моем проекте из-за некоторых ограничений развертывания так вместо этого, я создал эту точку зрения:Недопустимое имя объекта с точки зрения SQL

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.

Побольше контекст:

  • мнение, что я создаю не в базе данных PersonalData, но в другой базе данных под названием Platform.
  • Я проверил контекст, и все в порядке, я создаю представление в базе данных Platform.

Почему это происходит?

+2

Вы не можете использовать 'SELECT u. [Id] AS [id]'? Похоже, что создание представления наводит вашу таблицу 'Titles' просто отлично –

+0

@MattBusche. Если вы добавите немного подробностей, я думаю, вы должны опубликовать это как ответ на этот вопрос. –

+0

@MattBusche: это ответ (позор меня). Ответьте, я соглашусь. Спасибо – lontivero

ответ

3

Вам необходимо добавить имя таблицы в поле [id]. Поскольку это поле находится в обеих таблицах, поэтому он считается неоднозначным (представление не знает, из какой таблицы его получить).

SELECT u.[Id] AS [id] 
1

Попробуйте

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

Оказывается, что и ваш стол пользователя и ваши Титулы таба есть столбец с именем «Id». Это говорит вам, что он не знает, какой столбец идентификатора вы имеете в виду в списке столбцов SELECT.

2

Вопрос IntelliSense является периферическим, и это может быть из-за:

  1. предыдущая ошибка синтаксиса (вы должны сказать SQL Server которогоId вы имеете в виду, так как она существует в обеих таблицах), или
  2. , что ваш локальный кеш IntelliSense устарел. Вы можете исправить это путем выдачи Ctrl + Сдвиг + R или с использованием Edit > IntelliSense > Refresh Local Cache (и, в зависимости от сетевого подключения к серверу, ожидая секунд или даже минут).

То есть, я хотел бы предложить два изменения, один серьезный и один только лучшие практики:

  1. Не называть столбцы Id. Имя совершенно бессмысленно. Это UserID? Хорошо, назовите его UserID везде, где он отображается в схеме.
  2. Правильный префикс все столбцов в ваших запросах, а не только те, у которых есть столкновение имен. Это упрощает понимание вашего запроса и препятствует тому, чтобы люди вручную выясняли, из какой таблицы столбца.
Смежные вопросы