Sql server SQL Server 2008:自定义聚合函数和索引视图
在使用自定义CLR聚合函数的视图上创建索引时遇到问题 我看不到任何方法可以将聚合函数标记为确定性函数或schemabinding函数 我创建的函数如下所示: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(
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如何希望通过用户定义的聚合实现类似的功能呢?用户定义聚合的当前接口没有您需要的那种支持(它还需要一个类似触发器的接口)