2011-11-18 46 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