2011-10-11 78 views
0

考虑这个SQL无法创建索引视图

CREATE VIEW [dbo].[MyView1] ([ID],[VisitDate],[StartDate] ,[EndDate],[MyCount]) 
WITH SCHEMABINDING 

AS 
SELECT  id, VisitDate,dateadd(dd,-10,VisitDate),dateadd(dd,10,VisitDate), 
count_BIG(*)as MyCount 
FROM   dbo.Visits2 
group by id,VisitDate 

我试图创建的ID这一观点聚集索引,VisitDate.I正在以下错误。

无法创建聚集索引“IX_!”对视图“CI_DB.dbo.MyView4” ,因为该视图的选择列表包含关于 聚合函数的结果或分组列的表达式。
考虑删除聚合函数结果上的表达式或 从选择列表中分组列。

+0

我将不包括在该定义中的2分计算列反正即使你发现周围的错误的方式。这在运行时计算并不重要,只是意味着视图存储需要更多页面。 –

+0

@Martin。但是我有一个关于Visitdate的索引,当我使用这个dateadd时,我的索引是没有意义的吗?我真的希望这些被预先计算并坚持下去。如果你做了' –

+0

索引将不会被使用WHERE DATEADD(DD,-10,VisitDate)= @ startdate'但是这当然是很容易重新安排为'WHERE VisitDate = DATEADD(DD,10,@开始日期) ' –

回答

0

改变了SQL来

CREATE VIEW [dbo].[MyView2] ([ID],[VisitDate],[StartDate] ,[EndDate],[MyCount]) 
WITH SCHEMABINDING 

AS 
SELECT  id, VisitDate, 
dateadd(day,duration,VisitDate) startdate 
,dateadd(day,duration,VisitDate) enddate, 
count_BIG(*)as MyCount 
FROM   dbo.Visits3 
group by id,VisitDate,dateadd(day,duration,VisitDate),dateadd(day,duration,VisitDate) 

GO 

好像你不能指定一个像10的功能和GROUP BY clause.Now它里面工作的直接价值!

0

这是一个非常明确的错误消息,您的视图不是可以被索引的视图。关于可以索引什么种类的视图有许多条件。

+0

可我知道为什么吗?'DATEADD是确定性的功能吧? –

1

This is a known issue since 2006.

如果在索引视图的聚集,并兼具领域并应用于该领域的表现都在GROUP BY(这我假设你刚刚离开了您的示例代码)引擎不会允许你创建它。

有一些解决方法,但他们都不是很直接的。基本上你需要愚弄引擎,认为这些领域是不同的。

+0

我没有其他任何东西在我的'分组依据'条款 –

+0

@AshleyJohn - 尝试添加它? – JNK

+0

你想让我在Group BY子句中添加'dateadd(dd,-10,VisitDate),dateadd(dd,10,VisitDate)'? –