欢迎来到天天文库
浏览记录
ID:41489765
大小:60.70 KB
页数:7页
时间:2019-08-26
《用C自定义聚合函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、在SQL中,经常需要对数据按组进行白定义的聚合操作,比如用逗号连接一系列表示ID的数字,但默认只有SUM,MAX,MIN,AVG等聚合函数。在SQLServer2005中提供了编写CLR的托管代码的支持,我们可以用來写自定义的聚合函数。比如对于如下数据:AgeName20张三I-21李四I-20王二I-22赵五I-18钱六我们想得到AgNamee18钱六20张三,王二21李四22赵五需要实现一个聚合函数StrJoin,其功能是用逗号连接字符串。预期的SQL语句如下:selectAge,dbo.StrJoin(Name)asNamefr
2、omSomeTable耍实现这个函数,用VisualStudio2005建立一个C#的Database项项冃模版选择SQLServer数据库。在项目管理器里添加一个Aggregate后,输入代码如下:usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Data.SqlTypes;usingMicrosoft.SqIServer.Server;usingSystem.Text;[Serializable][Microsoft.SqlServer.Serv
3、er.SqlUserDefinedAggregate(Format.UserDefined,lslnvariantToDuplicates=false,IsInvariantToNulls=true,IslnvariantToOrder二false,lsNulllfEmpty=true5MaxByteSize=8000)]publicstructStrJoin:IBinarySerialize{privateStringBuilder_result;publicvoidlnit(){_result=newStringBuilder()
4、;}publicvoidAccumulate(SqlStringValue){if(Value.lsNull){return;}else{if(_resuIt.Length>0)_result.Append(H,f,);_result.Append(Value.Value);}}publicvoidMerge(StrJoinGroup){_result.Append(Group._result);publicSqIStringTerminate(){if(_result.Length>0){returnnewSqIString(_re
5、sult.ToString());}returnnewSqIString(””);#regionIBinarySerializeMemberspublicvoidRead(SystenrlO.BinaryReaderr){_result=newStringBuilder(r.ReadString());publicvoidWrite(System.lO.BinaryWriterw){w.Write(_result.ToString());#endregion}这里不叙述详细的操作步骤,网上应该可以搜到很多。其原理是该类中提供了几个模版
6、方法:lnit(),Accumulate(),Merge(),Terminate().我们需要做的是在其屮写自己的聚合逻辑即可。这几个方法的含义分别是初始化,扫描到一条记录时,合并,终止扫描。需要注意以下几点:1.自定义聚集函数中,我们返回的数据会被序列化然后转换到SQLServer中,对一些数值类型Framework提供了默认的序列化机制,但其他一些CLR的类型比如string就必须自己实现序列化机制,也就是实现IBinarySerialize接口。2.返回值和SQLServer里定义的变量一样,受到8000字节的长度限制。3.SQ
7、LServer2005必须设置兼容性级别为"SQLServer2005(90)",否则会出现如下错误:•EXTERNAL*附近有语法错误。您可能需要将当前数据库的兼容级別设置为更高的值,以启用此功能。有关存储过程sp.dbcmptlevel的信息,请参见帮助。4.需要开启SQLServer2005对CLR的支持(如果没有打开的话)。执行如下命令:EXECsp_configure*clrenabled*,1RECONFIGUREWITHOVERRIDEGOSQLServer字符串连接聚合函数.i.注册程序集:^WvSqlStrConca
8、te.dll,/S
此文档下载收益归作者所有