首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 冲浪宝典-> 邮件工具
用 c# 开发 sql server 2005 的自定义聚合函数_c#应用
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

在 SQL 中,经常需要对数据按组进行自定义的聚合操作,比如用逗号连接一系列表示 ID 的数字,但默认只有 SUM, MAX, MIN, AVG 等聚合函数。在 SQL Server 2005 中提供了编写 CLR 的托管代码的支持,我们可以用来写自定义的聚合函数。
比如对于如下数据:

Age Name
20 张三
21 李四
20 王二
22 赵五
18 钱六

我们想得到

Age Name
18 钱六
20 张三,王二
21 李四
22 赵五
需要实现一个聚合函数 StrJoin, 其功能是用逗号连接字符串。
预期的 SQL 语句如下:
select
    Age,
    dbo.StrJoin(Name) as Name
from
    SomeTable
要实现这个函数,用 Visual Studio 2005 建立一个 C# 的 Database 项目,项目模版选择 SQL Server 数据库。在项目管理器里添加一个 Aggregate 后,输入代码如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,
    IsInvariantToDuplicates=false,
    IsInvariantToNulls=true,
    IsInvariantToOrder=false,
    IsNullIfEmpty=true,
    MaxByteSize=8000
)]
public struct StrJoin: IBinarySerialize {
    private StringBuilder _result;

    public void Init() {
        _result = new StringBuilder();
    }

    public void Accumulate(SqlString Value) {
        if (Value.IsNull) {
            return;
        } else {
            if (_result.Length > 0)
                _result.Append(",");
            _result.Append(Value.Value);
        }
    }

    public void Merge(StrJoin Group) {
        _result.Append(Group._result);
    }

    public SqlString Terminate() {
        if (_result.Length > 0) {
            return new SqlString(_result.ToString());
        }
        return new SqlString("");
    }

    #region IBinarySerialize Members

    public void Read(System.IO.BinaryReader r) {
        _result = new StringBuilder(r.ReadString());
    }

    public void Write(System.IO.BinaryWriter w) {
        w.Write(_result.ToString());
    }

    #endregion
}

这里不叙述详细的操作步骤,网上应该可以搜到很多。
其原理是该类中提供了几个模版方法:Init(), Accumulate(), Merge(), Terminate().
我们需要做的是在其中写自己的聚合逻辑即可。这几个方法的含义分别是初始化,扫描到一条记录时,合并,终止扫描。

需要注意以下几点:

1. 自定义聚集函数中,我们返回的数据会被序列化然后转换到 SQL Server 中,对一些数值类型 Framework 提供了默认的序列化机制,但其他一些 CLR 的类型比如 string 就必须自己实现序列化机制,也就是实现 IBinarySerialize 接口。

2. 返回值和 SQL Server 里定义的变量一样,受到 8000 字节的长度限制。

3. SQL Server 2005 必须设置兼容性级别为 "SQL Server 2005(90)", 否则会出现如下错误:
 EXTERNAL 附近有语法错误。您可能需要将当前数据库的兼容级别设置为更高的值,
以启用此功能。有关存储过程 sp_dbcmptlevel 的信息,请参见帮助。
4. 需要开启 SQL Server 2005 对 CLR 的支持(如果没有打开的话)。
执行如下命令:
EXEC sp_configure clr enabled, 1
RECONFIGURE WITH OVERRIDE
GO

http://www.cnblogs.com/RChen/archive/2006/11/15/sql2k5_clr.html


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·25m的hotmail免费邮箱申请方法
·用C#下的Raw Socket编程实现网络封包监视-.NET教程,C#语言
·Java JDBC连接的一个例子-JSP教程,Java技巧及代码
·Java Swing入门基础-JSP教程,Java技巧及代码
·Java用户界面本地化实例探索-JSP教程,Java技巧及代码
·有数据绑定、排序、查找功能的ListView(一)-.NET教程,数据库应用
·有线电视3信号放大器特点及常见故障分析
·[ASP.NET]使用C#开发Socket通讯-.NET教程,C#语言
·Session 详解-ASP教程,ASP应用
·ASP.net 2005 Treeview 无限分类非地递归终极解决方案-.NET教程,Asp.Net开发
最新文章
·做google月入一万rmb提示交流_网赚技巧
·英文视频:google adsense技巧视频教程_网赚技巧
·专访51auto创始人:5句话融到4000多万_站长访谈
·站长访谈—sen:骨灰级站长的10年网络生涯_站长访谈
·站长访谈:天涯—曾经的hacker,现在的我_站长访谈
·个人网站如何才能成功?_站长心得
·网站如何获得成功?确定目标是关键_站长心得
·blog广告新创意:review me_站长心得
·利用dns技术解决internet南北互访_站长心得
·googleadsense常用技巧总结_google推广
相关主题
  • 用 C# 获取 IE 临时文件-.NET教程,C#语言
  • 用 C# 编写一个停放在任务栏上的图标程序-.NET教程,Windows开发
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭