进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> .Net -> 文章内容  
用 C# 开发 SQL Server 2005 的自定义聚合函数

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

AgeName
20张三
21李四
20王二
22赵五
18钱六
www.goodsgy.com

我们想得到www.goodsgy.com

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

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;www.goodsgy.com

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

    public void Init() {
        _result = new StringBuilder();
    }www.goodsgy.com

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

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

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

    #region IBinarySerialize Memberswww.goodsgy.com

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

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

    #endregion
}www.goodsgy.com

www.goodsgy.com

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

需要注意以下几点:www.goodsgy.com

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

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

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
GOwww.goodsgy.com

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

在百度中搜索:用 C# 开发 SQL Server 2005 的自定义聚合函数
在Google中搜索:用 C# 开发 SQL Server 2005 的自定义聚合函数
在Yahoo中搜索:用 C# 开发 SQL Server 2005 的自定义聚合函数

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· [组图] WPS文字抢先试用 WPS Office2007发..
· [组图] 用 Photoshop 打造塑料文字特效
· [组图] Photoshop应用 图层样式调色让照片..
· [组图] Photoshop应用 打造时尚的NIKE球鞋..
· [组图] 用 Photoshop 快速制作绳子
· 用 JavaScript 迁移目录
· target 属性怎么用 JS 来控制?
· 用 JavaScript 来操作字符串的函数
· [图文] 如何用 JavaHelp 系统开发和交付更..
· [组图] 用 Dreamweaer 自己动手制作活动菜..
 
· ASP.Net实现将Word转换PDF格式
· C#中的数字格式化、格式日期格式化
· 在ASP.NET中跨页面实现多选
· Asp.net编程中的数组基础实例学习
· [组图] ASP.NET构架与安全机制之Http请求处..
· ASP.NET如何保留两位小数点
· Visual C#多线程参数传递浅析
· 在Visual C#中定义和使用自己的特性
· [图文] 利用C#远程存取Access数据库
· 用VB.NET 2005编写定时关机程序

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)