SQL Server 2005 自定义聚合函数应用

原创 2006年05月31日 11:37:00

原贴:

http://community.csdn.net/Expert/topic/4790/4790673.xml?temp=.4949304

已知表A:
ID     DESC
1       a
1       b
2       c
3       d
2       e

要得到表B的结构如下

ID     Desc
1      a;b
2      c;e
3      d

也就是说ID相同的话,我要把DESC的内容加到一起

 

--解决办法:

1: 在SQL server 2000 中一般定义函数处理,(具体略)

2: 在SQL server 2005 中可以定义托管代码CLR处理.

  方法如下:

--可以利用.net 2005 创建一个拖管函数,如下:

--1: .net 部分

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.IO;
using System.Text;

[Serializable]
[SqlUserDefinedAggregate(
    Format.UserDefined,                 //使用UserDefined 序列化格式
    IsInvariantToNulls = true,          //聚合是否与空值有关
    IsInvariantToDuplicates = false,    //聚合是否与重复值有关
    IsInvariantToOrder = false,         //聚合是否与顺序有关
    MaxByteSize = 8000)                 //聚合实例的最大大小(以字节为单位)
]
public class Concatenate : IBinarySerialize
{
    /// <summary>
    /// 定义变量
    /// </summary>
    private StringBuilder intermediateResult;
    /// <summary>
    /// 初始化
    /// </summary>
    public void Init()
    {
        this.intermediateResult = new StringBuilder();
    }

    /// <summary>
    /// 如果某一个字符不为空,用";"追加
    /// </summary>
    /// <param name="value"></param>
    public void Accumulate(SqlString value ) //symbol
    {
        if (value.IsNull)
        {
            return;
        }
        this.intermediateResult.Append(value.Value).Append(';');
    }
    /// <summary>
    /// 合并字符
    /// </summary>
    /// <param name="other"></param>
    public void Merge(Concatenate other)
    {
        this.intermediateResult.Append(other.intermediateResult);
    }

    /// <summary>
    /// 处理最后的","
    /// </summary>
    /// <returns></returns>
    public SqlString Terminate()
    {
        string output = string.Empty;
       //删除最后的","
        if (this.intermediateResult != null
            && this.intermediateResult.Length > 0)
        {
            output = this.intermediateResult.ToString(0, this.intermediateResult.Length - 1);
        }

        return new SqlString(output);
    }

    public void Read(BinaryReader r)
    {
        intermediateResult = new StringBuilder(r.ReadString());
    }

    public void Write(BinaryWriter w)
    {
        w.Write(this.intermediateResult.ToString());
    }
}


---2: 数据库部分
----创建创建包含类元数据和托管代码的托管应用程序模块,将其作为 SQL Server 实例中的对象。
CREATE ASSEMBLY SQL_Aggregate FROM 'D:/IISWebRoot/SQLCLR/SQLFunction/SQLFunction/bin/Debug/SQLFunction.dll'
GO
CREATE AGGREGATE SQL_Aggregate (@input nvarchar(200)) RETURNS nvarchar(max)
EXTERNAL NAME SQL_Aggregate.Concatenate

--测试环境
create table tb(ID int,[desc]  varchar(10))
insert into tb
select 1,'a'
union all select 1,'b'
union all select 2,'c'
union all select 3,'d'
union all select 2,'e'
go


--调用

select id,dbo.SQL_Aggregate([desc])
from tb
group by id

--结果
/*
ID     Desc
------- ----------
1           a;b
2           c;e
3           d

(3 行受影响)
*/

--结论

--在SQL server 2005 自定义该聚合函数后,以后均可以使用该自定义聚合函数,实现数据合并.

--删除环境
drop table tb
drop AGGREGATE SQL_Aggregate
drop ASSEMBLY SQL_Aggregate

C#中创建SQLServer的自定义聚合函数

1.创建:使用VS2005的“聚合函数”模板创建,实现以下几个方法:  Init():给每个要聚合的新组初始化;  Accumulate():将每个值聚合;  Merge():将一个聚合组的结果添加到...
  • lifangshan_fang
  • lifangshan_fang
  • 2009年12月31日 14:07
  • 786

自定义字符串聚合函数

  • 2012年08月23日 11:09
  • 2KB
  • 下载

SqlServer自定义多参数聚合函数实例代码

  • 2010年04月15日 15:53
  • 6KB
  • 下载

SQL Server BUG集之"自定义函数与group by"

/**==** 1. 自定义函数用于group by时出错 **==**/--一个简单的函数create function f_str(@str sysname,@i int)returns char...
  • zjcxc
  • zjcxc
  • 2004年07月21日 13:27
  • 2829

Hive自定义UDF和聚合函数UDAF

转自:http://computerdragon.blog.51cto.com/6235984/1288567 Hive是一种构建在Hadoop上的数据仓库,Hive把SQL查询转换为一系列在H...
  • xiaokang06
  • xiaokang06
  • 2016年09月13日 16:21
  • 1150

实例详解Sql Server 所有聚合函数--【叶子】

一、Sql Server 中有哪些聚合函数? 提到聚合函数大家一定会首先想到最常用的: 1、 求个数:count 2、 求总和:sum 3、 求最大值:max 4、 求最小值:min 5、...
  • maco_wang
  • maco_wang
  • 2011年11月25日 15:08
  • 23264

SQL Server 2005 自定义聚合函数应用

原贴:http://community.csdn.net/Expert/topic/4790/4790673.xml?temp=.4949304已知表A:ID     DESC1       a1  ...
  • zlp321002
  • zlp321002
  • 2006年05月31日 11:37
  • 6662

用 C# 开发 SQL Server 2005 的自定义聚合函数

在 SQL 中,经常需要对数据按组进行自定义的聚合操作,比如用逗号连接一系列表示 ID 的数字,但默认只有 SUM, MAX, MIN, AVG 等聚合函数。在 SQL Server 2005 中提供...
  • gaozhigang
  • gaozhigang
  • 2008年12月03日 13:58
  • 1030

visual studio 2005 简体中文团队开发版 SQL server 2005简体中文版下载

http://www.ssxz.comSQL server 2005简体中文版下载这个是32位的(推崇)点击下载下面这两个是64位的CD1CD2两个CD都要下载visual studio 2005 简...
  • iuhxq
  • iuhxq
  • 2006年02月01日 11:18
  • 13194

sqlserver 2005导出数据为sql的办法

在2005中只能把数据库表的结构导出为sql是可以的,但是默认情况下是无法导出数据为sql的。但是在2008中是可以把数据也导出为sql的。这里介绍一个办法在2005中把数据导出为sql。先下载一个m...
  • silence1214
  • silence1214
  • 2011年04月12日 15:40
  • 5606
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server 2005 自定义聚合函数应用
举报原因:
原因补充:

(最多只允许输入30个字)