不多说了,说明后面是完整的代码,用来将字符串型的字段的各行的值拼成一个大字符串,也就是通常所说的Concat

例如有如下表dict

 ID  NAME  CATEGORY
 1 RED  COLOR 
 2 BLUE COLOR
 3 APPLE  FRUIT
 4 ORANGE FRUIT

执行SQL语句:select category,dbo.concatenate(name) as names from dict group by category.

得到结果表如下

 category  names
 COLOR REDBLUE 
 FRUIT  APPLEORANGE

如果觉得需要用逗号或分号或其他任何你想要的分隔符分开,可以修改下面的代码来实现。

在VS2005中,创建一个连接到目标库的SQL SERVER PROJECT,然后填加一个“聚合”,将下面的代码复制进去,编译后,部署即可,然后在SQL SERVER中的“可编程性”“函数”“聚合函数”中就可以看到该函数了。

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

[Serializable]
[SqlUserDefinedAggregate(
    Format.UserDefined, //use clr serialization to serialize the intermediate result
    IsInvariantToNulls = true, //optimizer property
    IsInvariantToDuplicates = false, //optimizer property
    IsInvariantToOrder = false, //optimizer property
    MaxByteSize = 8000) //maximum size in bytes of persisted value
]
public class Concatenate : IBinarySerialize
{
    /// <summary>
    /// The variable that holds the intermediate result of the concatenation
    /// </summary>
    private StringBuilder intermediateResult;

/// <summary>
    /// Initialize the internal data structures
    /// </summary>
    public void Init()
    {
        this.intermediateResult = new StringBuilder();
    }

/// <summary>
    /// Accumulate the next value, not if the value is null
    /// </summary>
    /// <param name="value"></param>
    public void Accumulate(SqlString value)
    {
        if (value.IsNull)
        {
            return;
        }

this.intermediateResult.Append(value.Value);
    }

/// <summary>
    /// Merge the partially computed aggregate with this aggregate.
    /// </summary>
    /// <param name="other"></param>
    public void Merge(Concatenate other)
    {
        this.intermediateResult.Append(other.intermediateResult);
    }

/// <summary>
    /// Called at the end of aggregation, to return the results of the aggregation.
    /// </summary>
    /// <returns></returns>
    public SqlString Terminate()
    {
        string output = string.Empty;
        //delete the trailing comma, if any
        if (this.intermediateResult != null
            && this.intermediateResult.Length > 0)
        {
            output = this.intermediateResult.ToString(0, this.intermediateResult.Length );
        }

return new SqlString(output);
    }

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

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

这里有几个比较重要的方法:Terminate,这个方法是聚合最后调用的方法,它返回最后的值。可以是SQL Server的任何标量;Accumulate,聚合每处理一行数据的时候都会调用一次,并将要处理的数据传给方法。可以在函数内部进行比如比较,合并之类的处理。

本文转自 netcorner 博客园博客,原文链接:http://www.cnblogs.com/netcorner/archive/2013/04/13/3017693.html   ,如需转载请自行联系原作者

SQL SERVER 2005允许自定义聚合函数相关推荐

  1. Sql server 2005 中的dense_rank()函数的应用

    sql server 2005 排名提供dense_rank() 函数.实现起来非常简单. 示例如下: declare @t table(place int,score int) insert int ...

  2. ASP.NET 2.0在SQL Server 2005上自定义分页

    这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页.对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法.如果需要,这篇文章会补上这里 ...

  3. SQL Server 2005,2008 正则表达式 替换函数应用详解

    CREATE function dbo.regexReplace ( @source ntext, --原字符串 @regexp varchar(1000), --正则表达式 @replace var ...

  4. 深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数

    概述 COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来指示表或视图中有哪些列已被插入或者更新.它通常和IF语句一起使用,从而可以根据不同的结果 ...

  5. 使用 SQL Server 2005中的 CLR 集成

    Balaji Rathakrishnan Christian Kleinerman Brad Richards Ramachandran Venkatesh Vineet Rao Microsoft ...

  6. Sql Server 2005 ROW_NUMBER 函数实现分页

    过去用SQL Server 2000分页的,大多都用到了临时表.SQL Server 2005 ROW_NUMBER 函数支持分页,性能据说也非常不错. Paging Records Using SQ ...

  7. Sql Server 2005自定义分页

    前面一篇随笔,我提到了Sql Server 2000的自定义分页,但是在sql server 2000中,要实现显示某一页,就返回那一页数据的效果的方法实在不尽人意.网上很多通用的分页存储过程,但看着 ...

  8. SQL Server 2005 用户自定义函数

    (<SQL Server 2005 编程入门经典> 第13章) 用户自定义函数和存储过程非常相似,但它们也有一些行为和能力的区别. 13.1 UDF的定义 用户自定义函数是有序的T-SQL ...

  9. SQL Server 2005 MD5函数

    原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的M ...

最新文章

  1. 把你手机里的照片秒变3D!Facebook训练了一个CNN端到端系统
  2. mysql parameters_MySqlCommand Command.Parameters.Add已过时
  3. 弱电工程室内外光纤敷设有哪些技术要求
  4. iTerm2 使用笔记
  5. java new class 直接调用_java中创建对象的的两种方式具体解释,一个是new一个是调用Class类的newinstance方法?...
  6. Java 设计模式之中介者模式
  7. 中国特种电器灯泡行业市场供需与战略研究报告
  8. qt实现无边框窗体的拉伸和拖动(附原理)
  9. 刘意JavaSE 学习笔记 Day19-Day21——异常,IO(File类/字符流/字节流)
  10. cam电路原理图 h7 openmv4_Protel电路设计软件难点解答(上)
  11. 【OR】YALMIP 含参数规划
  12. 使用WePE对无法启动的系统文件进行操作
  13. 把html模板vue框架,vue框架搭建个人博客网站模板
  14. 正确的座机号码格式_电话号码的正确写法(我就知道你不知道)
  15. 国内O2O运营模式逐渐改变我们生活方式
  16. jquery与ajax实现增删改查
  17. 小布助手对话短文本语义匹配
  18. javaSE 打印流,PrintWriter,PrintStream。 打印到输出流(文件)中
  19. 团员大会如何写组织学习计算机知识,团支部召开接收新团员的支部大会的会议记录怎么写?...
  20. 检测椭圆的长短轴参数

热门文章

  1. blog被封了文章全被删除了,郁闷
  2. 基于语言文件的asp.net全球化解决方案
  3. ECharts - 背景透明
  4. Drupal Working with nodes, content types and fields
  5. Can not issue data manipulation statements with executeQuery()错误解决
  6. 史上最简单MySQL教程详解(进阶篇)之存储过程(一)
  7. Xcode9学习笔记63 - 使用SystemSoundId播放简短声音(太长的无法播放)
  8. Android AOP之路三 Android上的注解
  9. Java中Comparable和Comparator接口区别分析
  10. HTML5 音频 audio