SQL Server索引视图错误

时间:2011-11-18 05:12:44

标签: sql-server sql-server-2005 indexed-view

我意识到这是一个非常人为的例子,但我已将完整版简化为以下版本,以说明问题:

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]);

我明白了:

  

Msg 8668,Level 16,State 0,Line 12
      无法在视图'PracticeRepository.model.Appointments_Partition1'上创建聚簇索引'IX_Appointments_Partition1_Id',因为视图的选择列表包含聚合函数或分组列结果的表达式。考虑从聚合函数的结果中删除表达式或从选择列表中分组列。

我要包括count_big ...那么为什么这个组出现了问题?....我该如何解决这个错误?

2 个答案:

答案 0 :(得分:5)

以下是应用了一些布尔逻辑的相同错误消息:

  

无法在视图'...'上创建聚簇索引'...',因为   选择视图列表包含分组列上的表达式。   请考虑从选择列表中删除分组列上的表达式。

您需要移除CONVERT

中的CONVERT(varchar(15), AppointmentId)

答案 1 :(得分:-1)

我在其中一个博客上找到了这个理由,对我来说似乎很合理

  

不,您不能在具有聚合的视图上使用架构绑定。除非使用模式绑定,否则无法索引视图。您也无法绑定使用外连接或左连接的索引。基本上,您只能绑定包含简单select语句的视图。

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

您可以浏览博客,看看它是否与您的方案完全匹配。

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

如果要在视图上构建索引,则必须使用模式绑定创建视图,在上面的链接中将对其进行详细说明。浏览设计注意事项部分