CLR 用户定义聚合的要求

只要公共语言运行时 (CLR) 程序集中的类型实现了所需的聚合约定,就可以将它作为用户定义聚合函数注册。 此协定由 SqlUserDefinedAggregate 属性和聚合协定方法组成。 聚合协定包括保存聚合的中间状态的机制,以及用于累积新值的机制,其中包括四种方法: InitAccumulateMergeTerminate。 满足这些要求后,你将能够充分利用 Microsoft SQL Server 中的用户定义的聚合。 本主题的以下部分提供了有关如何创建和使用用户定义的聚合的其他详细信息。 有关示例,请参阅 调用 CLR User-Defined 聚合函数

SqlUserDefinedAggregate

有关详细信息,请参阅 SqlUserDefinedAggregateAttribute

聚合方法

注册为用户定义聚合的类应支持以下实例方法。 以下是查询处理器用于计算聚合的方法:

方法 语法 DESCRIPTION
Init public void Init(); 查询处理器使用此方法初始化聚合的计算。 对于查询处理器正在聚合的每个组调用此方法一次。 查询处理器可以选择重复使用聚合类的同一实例来计算多个组的聚合。 该方法 Init 应根据以前对此实例的使用执行任何清理作,并使其重新启动新的聚合计算。
Accumulate public void Accumulate (input-type value[, input-type value, ...]]; 表示该函数的参数的一个或多个参数。 input_type 应是与 语句中 CREATE AGGREGATE 指定的本机 SQL Server 数据类型等效的托管 SQL Server 数据类型。 有关详细信息,请参阅 映射 CLR 参数数据

对于用户定义类型 (UDT),input-type 与 UDT 类型相同。 查询处理器使用此方法累计聚合值。 对于正在聚合的组中的每个值调用此方法一次。 查询处理器始终仅在对聚合类的给定实例调用 Init 方法后调用此方法。 此方法的实现应更新实例的状态以反映正在传递的参数值的累计。
Merge public void Merge(udagg_class value); 此方法可以将此聚合的另一实例与当前实例合并。 查询处理器使用此方法合并聚合的多个部分计算。
Terminate public return_type Terminate(); 此方法完成聚合计算并返回聚合的结果。 return_type 应该是托管 SQL Server 数据类型,该数据类型与 语句中指定的 CREATE AGGREGATE 的托管等效项。 return_type也可以是用户定义的类型。

表值参数

表值参数 (TVP) 即传递到某一过程或函数的用户定义表类型,它提供了一种将多行数据传递到服务器的高效方法。 TVP 提供与参数数组类似的功能,但提供更大的灵活性和更紧密的与 Transact-SQL 的集成。 它们还提供提升性能的潜力。 TVP 还有助于减少到服务器的往返次数。 可以将数据作为 TVP 发送到服务器,而不是向服务器发送多个请求(例如,对于标量参数列表)。 用户定义表类型不能作为表值参数传递给在 SQL Server 进程中执行的托管存储过程或函数,也不能作为表值参数返回。 此外,不能在上下文连接范围内使用 TVP。 但是,如果 TVP 在不是上下文连接的连接中使用,则可以在 SQL Server 进程中执行的托管存储过程或函数中与 SqlClient 一起使用。 该连接可以连接到执行托管过程或函数的同一服务器。 有关 TVP 的详细信息,请参阅使用 Table-Valued 参数(数据库引擎)。

更改历史记录

更新的内容
更新了方法的说明 Accumulate ;它现在接受多个参数。

另请参阅

CLR User-Defined 类型
调用 CLR User-Defined 聚合函数