2011-08-15 127 views
3

我在使用自定義CLR聚合函數的視圖上創建索引時遇到問題。SQL Server 2008:自定義聚合函數和索引視圖

我看不出任何方法來標記聚合函數確定性或與模式綁定。

我創建我的功能,像這樣:

CREATE ASSEMBLY StringUtil 
AUTHORIZATION dbo 
FROM 'C:\StringUtil.dll' 
WITH PERMISSION_SET = UNSAFE 
GO 

CREATE AGGREGATE SUMSTRING (@input nvarchar(200)) 
RETURNS nvarchar(max) WITH SCHEMABINDING 
EXTERNAL NAME StringUtil.Concatenate 

而我的觀點被定義爲:

CREATE VIEW RolledValues WITH SCHEMABINDING 
AS 
SELECT ID, SumString(ValueText) as Value FROM [dbo].[IDValue] 
GROUP BY ID 

當我嘗試上創建視圖索引出現該問題:

CREATE UNIQUE CLUSTERED INDEX IDX_RollValues_ID_VALUE on RolledValues (ID) 

Error: Cannot create index on view "dbo.RolledValues" because it uses aggregate 
"dbo.SumString". Consider eliminating the aggregate, not indexing the view, or 
using alternate aggregates. 

那麼有可能在索引視圖中使用自定義聚合函數嗎?我無法找到任何這資料...

回答

7

Creating Indexed Views列出了一些限制的頁:

在視圖中不能包含以下Transact-SQL語法元素的SELECT語句:

...

CLR用戶定義的聚合函數。

在當前,甚至沒有規定將CLR聚合描述爲確定性(至少,如果API將保持一致)。 SqlFunctionAttribute有一個IsDeterministic屬性。沒有這樣的屬性存在於SqlUserDefinedAggregateAttribute


它確實有助於推理的東西,如果你認爲爲什麼索引視圖存在這麼多的限制。

聚合上的那些有一個非常簡單的解釋 - 只允許使用聚合(如SUMCOUNT_BIG),它們具有SQL Server將能夠調整值或添加或刪除行的屬性該索引基於純粹爲作爲當前事務的主題的行的子集。

例如如果視圖有一行ID = 19,COUNT_BIG = 5和SUM = 96,並且事務刪除3行,其中 19,其SUM增加到43,則它可以將視圖的該行更新爲COUNT_BIG = 2和SUM = 53。或者,如果事務已刪除5行,且ID = 19,則會導致該行被刪除。

請注意,在這兩種情況下,我們不必檢查表中的任何其他行,以確定它們是否具有ID = 19。

那麼SQL Server如何希望實現與用戶定義的聚合類似的功能?用戶定義聚合的當前接口沒有你需要的那種支持(它也需要一個類似於接口的觸發器)。