Sql server SQL Server 2008:自定义聚合函数和索引视图

Sql server SQL Server 2008:自定义聚合函数和索引视图,sql-server,sql-server-2008,sqlclr,Sql Server,Sql Server 2008,Sqlclr,在使用自定义CLR聚合函数的视图上创建索引时遇到问题 我看不到任何方法可以将聚合函数标记为确定性函数或schemabinding函数 我创建的函数如下所示: CREATE ASSEMBLY StringUtil AUTHORIZATION dbo FROM 'C:\StringUtil.dll' WITH PERMISSION_SET = UNSAFE GO CREATE AGGREGATE SUMSTRING (@input nvarchar(200)) RETURNS nvarchar(

在使用自定义CLR聚合函数的视图上创建索引时遇到问题

我看不到任何方法可以将聚合函数标记为确定性函数或schemabinding函数

我创建的函数如下所示:

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.
那么,是否可以在索引视图中使用自定义聚合函数?我找不到有关此的任何文档…

上的页面列出了一些限制:

视图中的SELECT语句不能包含以下Transact-SQL语法元素:

CLR用户定义的聚合函数

目前甚至没有规定将CLR聚合描述为确定性的(至少,如果API是一致的)。具有
IsDeterministic
属性。该区域不存在此类财产


<> P>它有助于推理事物,如果你考虑为什么在索引视图上存在这么多限制。

聚合上的那些有一个非常简单的解释-您只允许使用聚合(例如
SUM
COUNT\u BIG
),这些聚合具有SQL Server能够调整值或从索引中添加或删除行的属性,仅基于作为当前事务主题的行的子集

例如,如果视图中有一行
ID
=19、
COUNT\u BIG
=5和
SUM
=96,并且一个事务删除了3行
ID
19,其
SUM
增加到43,那么它可以将视图中的该行更新为
COUNT\u BIG
=2和
SUM
=53。或者,如果事务删除了5行
ID
=19,则会导致删除该行

请注意,在任何一种情况下,我们都不必检查表中的任何其他行以确定它们是否具有
ID
=19

那么,SQL Server如何希望通过用户定义的聚合实现类似的功能呢?用户定义聚合的当前接口没有您需要的那种支持(它还需要一个类似触发器的接口)