Nov 18

使用C#实现SQL Server2005的扩展聚合函数 不指定

zpgm , 18:12 , Asp.Net 2.0 , 评论(0) , 引用(0) , 阅读(587) , Via 本站原创 | |
select xh, dbo.joinstr(value) from t_table group by xh


其中joinstr是一个聚合函数,功能是将每一组的某个字符串列的值首尾连接。上面的SQL也可以查询图2所示的结果。但遗憾的是,sql server2005并未提供可以连接字符串的聚合函数。下面我们就来使用C#来实现一个扩展聚合函数。

     首先用VS2008/VS2005建立一个SQL Server项目,如图6所示。
点击在新窗口中浏览此图片
点击“确定”按钮后,SQL Server项目会要求连接一个数据库,我们可以选择一个数据库,如图7所示。
点击在新窗口中浏览此图片
然后在工程中加入一个聚合类(joinstr.cs),如图8所示。
点击在新窗口中浏览此图片
joinstr.cs中的最终代码如下:


由于本例需要聚合字符串,而不是已经被序列化的类型,如int等,因此,需要实现IBinarySerialize接口来手动序列化。使用C#实现SQL Server聚合函数,也会受到字符串最大长度为8000的限制。

     在编写完上述代码后,可以使用Visual Studio来部署(右向工程,在弹出菜单上选“部署”即可)。也可以使用SQL语句来部署。假设上面的程序生成的dll为MyAggregate.dll,可以使用下面的SQL语句来部署:

要注意的是,字符串类型需要用nvarchar,而不能用varchar。

第一条SQL语句是装载dll,第二条SQL语句是注册joinstr聚合函数(每一个C#类就是一个聚合函数)

在执行上面的SQL语句之前,需要将SQL Server2005的clr功能打开。如图9所示。
点击在新窗口中浏览此图片
或执行:
EXEC sp_configure 'clr enabled', 1
RECONFIGURE WITH OVERRIDE
GO
如果想删除上面建立的聚合函数,可以使用如下的SQL语句:
drop aggregate joinstr

在删除聚合函数后,可以将MyAggregate.dll卸载。
drop assembly MyAgg

OK,现在可以使用joinstr来聚合字符串了。

发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]