2013-03-05 113 views
1

我不能在我的項目中使用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' 
LEFT OUTER JOIN

但是,Microsoft SQL Management Studio中凸顯[PersonalData].[dbo].[Titles]出現錯誤:

Invalid object name '[PersonalData].[dbo].[Titles] 

事實上,doesn't提供智能感知我該表的列。

[PersonalData].[dbo].[Titles]在那裏。事實上,下面的查詢返回結果沒有任何錯誤:

select * from [PersonalData].[dbo].[Titles] 

我對SQL知識是不夠深,但我不明白這是爲什麼,爲什麼它發現Users表,但doesn't找到Titles

多一點背景:

  • ,我創建視圖是不是在PersonalData數據庫,但在所謂的Platform其他數據庫。
  • 我檢查了上下文,它是好的,我在Platform數據庫中創建視圖。

爲什麼會發生?

+2

你不能使用'SELECT u。[Id] AS [id]'?看起來創建視圖就是找到你的'Titles'表格就好了 – 2013-03-05 19:15:36

+0

@MattBusche如果你添加一些細節,我認爲你應該把它作爲這個問題的答案。 – 2013-03-05 19:16:51

+0

@MattBusche:這是答案(我的恥辱)。請回答,我會接受它。謝謝 – lontivero 2013-03-05 19:18:50

回答

3

您需要將表名添加到您的[id]字段中。因爲該字段在兩個表中,所以它被認爲是不明確的(視圖不知道從哪個表中獲取)。

SELECT u.[Id] AS [id] 
1

嘗試

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

看來,無論您的用戶表和您的標題多部未華有一個名爲「ID」列。它告訴你它不知道你的SELECT列表中的Id列是什麼意思。

2

智能感知問題是外設,它可能是因爲:

  1. 以前的語法錯誤(你需要告訴SQL服務器Id你的意思是它,因爲它在兩個表中存在)或
  2. 您的本地智能感知緩存已過時。可以通過發出Ctrl鍵 + + - [R或使用Edit > IntelliSense > Refresh Local Cache(,並根據該網絡連接到服務器上,等待秒或甚至幾分鐘)解決此問題。

這就是說,我會建議兩個轉變,一個認真,一個只是一個最佳實踐:

  1. 不要將其命名列Id。這個名字完全沒有意義。這是一個UserID?好的,無論它在模式中出現在什麼地方,都可以稱它爲UserID
  2. 正確地在您的查詢中爲全部加上前綴,而不僅僅是那些具有名稱衝突的列。這使得您的查詢更易於理解,並防止人們不得不手動確定列來自哪個表。