viv*_*ron 3 sql-server sqlclr sql-server-2008
我在使用自定义CLR聚合函数的视图上创建索引时遇到问题.
我没有看到任何方法将聚合函数标记为确定性或使用模式绑定.
我正在创建我的函数:
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
Run Code Online (Sandbox Code Playgroud)
我的观点定义为:
CREATE VIEW RolledValues WITH SCHEMABINDING
AS
SELECT ID, SumString(ValueText) as Value FROM [dbo].[IDValue]
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)
当我尝试在该视图上创建索引时,会出现此问题:
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.
Run Code Online (Sandbox Code Playgroud)
那么可以在索引视图中使用自定义聚合函数吗?我找不到任何关于此的文件......
创建索引视图的页面列出了许多限制:
视图中的SELECT语句不能包含以下Transact-SQL语法元素:
...
CLR用户定义的聚合函数.
目前,甚至没有规定将CLR聚合描述为确定性(至少,如果API将是一致的).该SqlFunctionAttribute有一个IsDeterministic属性.SqlUserDefinedAggregateAttribute中不存在此类属性
如果您考虑为什么索引视图上存在如此多的限制,它确实有助于推理事情.
上聚集的那些有一个非常简单的解释-你只允许使用骨料(如SUM和COUNT_BIG)有SQL Server将能够调节值,或者添加或从索引中删除行的属性,基于纯粹的作为当前事务主题的行子集.
例如,如果视图的行为ID= 19,COUNT_BIG= 5和SUM= 96,并且事务删除3行ID19,其中SUM添加为43,则它可以将视图的该行更新为COUNT_BIG= 2和SUM= 53.或者,如果事务已删除5行ID= 19,则会导致删除该行.
请注意,在任何一种情况下,我们都不必检查表的任何其他行以确定它们是否具有ID= 19.
那么SQL Server如何希望用用户定义的聚合实现类似的功能呢?用户定义的聚合的当前接口没有您需要的那种支持(它还需要具有类似接口的触发器).
| 归档时间: |
|
| 查看次数: |
1489 次 |
| 最近记录: |