2011-11-18 47 views
1

我意識到這是一個很做作的例子,但我已經簡化了完整版到這表明了問題的情況如下:的SQL Server索引視圖錯誤

CREATE VIEW model.Appointments_Partition1 
WITH SCHEMABINDING AS 
    SELECT CONVERT(varchar(15), AppointmentId) as Id, 
     ap.AppTypeId as AppointmentTypeId, 
     ap.Duration as DurationMinutes, 
     ap.AppointmentId as EncounterId, 
     COUNT_BIG(*) as __count_big 
    FROM dbo.Appointments ap 
    JOIN dbo.PracticeCodeTable pct ON SUBSTRING(pct.Code, 1, 1) = ap.ScheduleStatus 
            AND pct.ReferenceType = 'AppointmentStatus' 
    WHERE ap.AppTime > 0 
GROUP BY CONVERT(varchar(15), AppointmentId), ap.AppTypeId, ap.Duration, ap.AppointmentId 

CREATE UNIQUE CLUSTERED INDEX [IX_Appointments_Partition1_Id] 
ON model.Appointments_Partition1 ([Id]); 

我得到:

因爲該視圖的選擇列表包含聚合函數或分組列的結果的表達式消息8668,級別16,狀態0,第12行
無法對視圖創建聚集索引「IX_Appointments_Partition1_Id「PracticeRepository.model.Appointments_Partition1」。考慮從選擇列表中刪除聚合函數或分組列的結果上的表達式。

我包括count_big ...那麼爲什麼組是由一個問題?....我怎樣才能解決這個錯誤?

+0

不知道我理解? – Jeff

回答

5

下面是應用了一些布爾邏輯相同的錯誤消息:

不能創建視圖「...」的聚集索引「...」,因爲 選擇視圖的列表包含上分組列的表達式。 考慮在從選擇列表中的一個分組列中除去表達。

您需要刪除CONVERTCONVERT(varchar(15), AppointmentId)

-1

我覺得這個原因上的博客之一,似乎是合理的我

不,你不能使用模式上有一個總的視圖結合。除非使用模式綁定,否則不能爲視圖編制索引。您也無法綁定使用外連接或左連接的索引。基本上,你只能綁定一個包含簡單選擇語句的視圖。

http://www.tek-tips.com/viewthread.cfm?qid=1401646

你可以通過博客,看看它是否完全匹配您的方案。

http://technet.microsoft.com/en-us/library/cc917715.aspx

如果你想建立的看法索引,那麼必須創建架構視圖結合,它詳細解釋上面的鏈接。通過設計考慮的部分去

+1

,根據該不正確的:「如果視圖定義使用聚合函數,SELECT列表還必須包括COUNT_BIG(*)。」 http://msdn.microsoft.com/en-us/library/ms191432(v=SQL.90).aspx – Jeff

+0

@ JeffN825請參見上面的編輯答案。這對於簡單視圖是正確的,但爲了在視圖上構建索引,您需要使用模式綁定視圖。問題不在聚合函數中,它在視圖上的索引中。 – Zohaib

+0

它是架構綁定。看問題 – Jeff