2011-10-11 124 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)'? –