SQLCLR(五)聚合
发布时间:2020-12-13 20:39:26 所属栏目:百科 来源:网络整理
导读:SQL Server中的聚合,常用的比如max,count之类。 我们现在也可以在SQLCLR里创建自定义的聚合。Visual Studio 2005中提供的聚合模板是一个结构,标注了[Serializable],[SqlUserDefinedAggregate]标签,这将让SQLCLR知道这是一个聚合函数。 看一段代码,这段代
SQL Server中的聚合,常用的比如max,count之类。 我们现在也可以在SQLCLR里创建自定义的聚合。Visual Studio 2005中提供的聚合模板是一个结构,标注了[Serializable],[SqlUserDefinedAggregate]标签,这将让SQLCLR知道这是一个聚合函数。
看一段代码,这段代码来自SQL Server 2005联机丛书,本来自己想写一段,但突然公司有些事要做,没时间了。示例代码作用是合并同一部书(ID相同)的作者。
using
System; 这里有几个比较重要的方法:Terminate,这个方法是聚合最后调用的方法,它返回最后的值。可以是SQL Server的任何标量。;Accumulate,聚合每处理一行数据的时候都会调用一次,并将要处理的数据传给方法。可以在函数内部进行比如比较,合并之类的处理。;
using System.Data; using Microsoft.SqlServer.Server; using System.Data.SqlTypes; using System.IO; using System.Text; [Serializable] [SqlUserDefinedAggregate( Format.UserDefined, // useclrserializationtoserializetheintermediateresult IsInvariantToNulls = true , // optimizerproperty IsInvariantToDuplicates = false , // optimizerproperty IsInvariantToOrder = false , // optimizerproperty MaxByteSize = 8000 ) // maximumsizeinbytesofpersistedvalue ] public class Concatenate:IBinarySerialize { /**////<summary> ///Thevariablethatholdstheintermediateresultoftheconcatenation ///</summary> privateStringBuilderintermediateResult; /**////<summary> ///Initializetheinternaldatastructures ///</summary> publicvoidInit() { this.intermediateResult=newStringBuilder(); } /**////<summary> ///Accumulatethenextvalue,notifthevalueisnull ///</summary> ///<paramname="value"></param> publicvoidAccumulate(SqlStringvalue) { if(value.IsNull) { return; } this.intermediateResult.Append(value.Value).Append(','); } /**////<summary> ///Mergethepartiallycomputedaggregatewiththisaggregate. ///</summary> ///<paramname="other"></param> publicvoidMerge(Concatenateother) { this.intermediateResult.Append(other.intermediateResult); } /**////<summary> ///Calledattheendofaggregation,toreturntheresultsoftheaggregation. ///</summary> ///<returns></returns> publicSqlStringTerminate() { stringoutput=string.Empty; //deletethetrailingcomma,ifany if(this.intermediateResult!=null &&this.intermediateResult.Length>0) { output=this.intermediateResult.ToString(0,this.intermediateResult.Length-1); } returnnewSqlString(output); } publicvoidRead(BinaryReaderr) { intermediateResult=newStringBuilder(r.ReadString()); } publicvoidWrite(BinaryWriterw) { w.Write(this.intermediateResult.ToString()); } }
CREATE
TABLE
BookAuthors
( BookID int NOT NULL , AuthorName nvarchar ( 200 ) NOT NULL ) INSERT BookAuthors VALUES ( 1 , ' Johnson ' ) INSERT BookAuthors VALUES ( 2 , ' Taylor ' ) INSERT BookAuthors VALUES ( 3 , ' Steven ' ) INSERT BookAuthors VALUES ( 2 , ' Mayler ' ) INSERT BookAuthors VALUES ( 3 , ' Roberts ' ) INSERT BookAuthors VALUES ( 3 , ' Michaels ' )
SELECT
BookID,dbo.MyAgg(AuthorName) 结果如下
FROM BookAuthors GROUP BY BookID
Microsoft SQL Server Management Studio为我们提供了数据库内对象的集中管理功能,前面几篇创建的SQLCLR对象,都可以在数据库的可编程性下相应模块里找到。 这一系列到此就算是结束了,谢谢大家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |