SQL SERVER 2005允许自定义聚合函数
不多说了,说明后面是完整的代码,用来将字符串型的字段的各行的值拼成一个大字符串,也就是通常所说的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允许自定义聚合函数相关推荐
- Sql server 2005 中的dense_rank()函数的应用
sql server 2005 排名提供dense_rank() 函数.实现起来非常简单. 示例如下: declare @t table(place int,score int) insert int ...
- ASP.NET 2.0在SQL Server 2005上自定义分页
这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页.对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法.如果需要,这篇文章会补上这里 ...
- SQL Server 2005,2008 正则表达式 替换函数应用详解
CREATE function dbo.regexReplace ( @source ntext, --原字符串 @regexp varchar(1000), --正则表达式 @replace var ...
- 深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数
概述 COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来指示表或视图中有哪些列已被插入或者更新.它通常和IF语句一起使用,从而可以根据不同的结果 ...
- 使用 SQL Server 2005中的 CLR 集成
Balaji Rathakrishnan Christian Kleinerman Brad Richards Ramachandran Venkatesh Vineet Rao Microsoft ...
- Sql Server 2005 ROW_NUMBER 函数实现分页
过去用SQL Server 2000分页的,大多都用到了临时表.SQL Server 2005 ROW_NUMBER 函数支持分页,性能据说也非常不错. Paging Records Using SQ ...
- Sql Server 2005自定义分页
前面一篇随笔,我提到了Sql Server 2000的自定义分页,但是在sql server 2000中,要实现显示某一页,就返回那一页数据的效果的方法实在不尽人意.网上很多通用的分页存储过程,但看着 ...
- SQL Server 2005 用户自定义函数
(<SQL Server 2005 编程入门经典> 第13章) 用户自定义函数和存储过程非常相似,但它们也有一些行为和能力的区别. 13.1 UDF的定义 用户自定义函数是有序的T-SQL ...
- SQL Server 2005 MD5函数
原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的M ...
最新文章
- 把你手机里的照片秒变3D!Facebook训练了一个CNN端到端系统
- mysql parameters_MySqlCommand Command.Parameters.Add已过时
- 弱电工程室内外光纤敷设有哪些技术要求
- iTerm2 使用笔记
- java new class 直接调用_java中创建对象的的两种方式具体解释,一个是new一个是调用Class类的newinstance方法?...
- Java 设计模式之中介者模式
- 中国特种电器灯泡行业市场供需与战略研究报告
- qt实现无边框窗体的拉伸和拖动(附原理)
- 刘意JavaSE 学习笔记 Day19-Day21——异常,IO(File类/字符流/字节流)
- cam电路原理图 h7 openmv4_Protel电路设计软件难点解答(上)
- 【OR】YALMIP 含参数规划
- 使用WePE对无法启动的系统文件进行操作
- 把html模板vue框架,vue框架搭建个人博客网站模板
- 正确的座机号码格式_电话号码的正确写法(我就知道你不知道)
- 国内O2O运营模式逐渐改变我们生活方式
- jquery与ajax实现增删改查
- 小布助手对话短文本语义匹配
- javaSE 打印流,PrintWriter,PrintStream。 打印到输出流(文件)中
- 团员大会如何写组织学习计算机知识,团支部召开接收新团员的支部大会的会议记录怎么写?...
- 检测椭圆的长短轴参数
热门文章
- blog被封了文章全被删除了,郁闷
- 基于语言文件的asp.net全球化解决方案
- ECharts - 背景透明
- Drupal Working with nodes, content types and fields
- Can not issue data manipulation statements with executeQuery()错误解决
- 史上最简单MySQL教程详解(进阶篇)之存储过程(一)
- Xcode9学习笔记63 - 使用SystemSoundId播放简短声音(太长的无法播放)
- Android AOP之路三 Android上的注解
- Java中Comparable和Comparator接口区别分析
- HTML5 音频 audio