SQL Server 字符串连接聚合函数.

  1. 注册程序集: 拷贝“SqlStrConcate.dll”至<sql安装根目录>/MSSQL.1/MSSQL/Binn目录下,执行下面的SQL:

    CREATE ASSEMBLY [SqlStrConcate]
    AUTHORIZATION [dbo]
    FROM 'D:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Binn/SqlStrConcate.dll'
    WITH PERMISSION_SET = SAFE
    GO

    上面的代码中, <sql安装根目录>为D:/Program Files/Microsoft SQL Server/

  2. 创建自定义函数:
    CREATE AGGREGATE StrConcate (@input nvarchar(200)) RETURNS nvarchar(max)
    EXTERNAL NAME SqlStrConcate.Concatenate
  3. 打开SQL Server 的CLR集成.方法: SQL Server 外围应用配置器 -> 功能的外围应用配置器 -> MSSQLSERVER -> Database Engine -> CLR集成 。勾选启用CLR集成
  4. OK了,现在你可以使用用户自定义字符串聚合函数StrConcate.测试代码如下:
  5. --------------------------------------------------------------
    -- 创建测试表
    --------------------------------------------------------------
    create table test_tb(pk_val int, startdate varchar(10), enddate VARCHAR(10), corpname VARCHAR(20)) --------------------------------------------------------------
    -- 插入测试数据
    --------------------------------------------------------------
    insert into test_tb
    select 1, '2005-01-01', '2007-06-29', '方正科技'
    union all
    select 1, '2007-07-01', '2009-06-29', '清华紫光'
    union all
    select 1, '2009-01-01', null, '用友软件'
    union all
    select 2, '1995-01-01', '2003-06-29', '微软中国'
    union all
    select 2, '2004-07-01', '2009-06-29', '盛大网络'
    go --------------------------------------------------------------
    -- 查询测试
    --------------------------------------------------------------
    select pk_val, dbo.StrConcate(startdate + '~' + isnull(enddate, '至今') + ':' + corpname) lvl_str from test_tb group by pk_val --------------------------------------------------------------
    -- 查询结果
    --------------------------------------------------------------
    pk_val lvl_str
    ----------- -----------------------------------------------------------------------------------------
    1 2005-01-01~2007-06-29:方正科技,2007-07-01~2009-06-29:清华紫光,2009-01-01~至今:用友软件
    2 1995-01-01~2003-06-29:微软中国,2004-07-01~2009-06-29:盛大网络
  6. SqlStrConcate.dll 代码(来自Sql Server的联机帮助)如下:
  7. 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).Append(',');     }
        /// <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 - 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());     } }

C#写的SQL聚合函数的更多相关文章

  1. SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

    top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...

  2. SQL 聚合函数

    SQL聚合函数 MAX---最大值 MIN--最小值 AVG--平均值 SUM--求和 COUNT--记录的条数 EXample: --从MyStudent表中查询最大年龄,最小年龄,平均年龄,年龄的 ...

  3. Sql Server的艺术(三) SQL聚合函数的应用

    SQL提供的聚合函数有求和,最大值,最小值,平均值,计数函数等. 聚合函数及其功能: 函数名称 函数功能 SUM() 返回选取结果集中所有值的总和 MAX() 返回选取结果集中所有值的最大值 MIN( ...

  4. sql 聚合函数、排序方法详解

    聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select Max(FSalary) from T_Employee 排 ...

  5. Spark学习之路(十一)—— Spark SQL 聚合函数 Aggregations

    一.简单聚合 1.1 数据准备 // 需要导入spark sql内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSess ...

  6. Spark 系列(十一)—— Spark SQL 聚合函数 Aggregations

    一.简单聚合 1.1 数据准备 // 需要导入 spark sql 内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSe ...

  7. sql 聚合函数用法,及执行顺序

    聚合函数无法用在where子句中 , 聚合函数包括count avg sum min max 子句执行顺序from -> where -> group by -> having -& ...

  8. sql 聚合函数和group by 联合使用

    原文 很多时候单独使用聚合函数的时候觉得很容易,求个平均值,求和,求个数等,但是和分组一起用就有点混淆了,好记性不如烂笔头,所以就记下来以后看看. 常用聚合函数罗列 1 AVG() - 返回平均值 C ...

  9. SQL聚合函数

随机推荐

  1. PureCSS框架

    http://www.tuicool.com/articles/iyiI32 Pure中的主要组件包括: 一个响应式网格,可根据需求定制. 一个基于 Normalize.css 的基础库,用于修复跨浏 ...

  2. C#中,为什么结构体也可以设置构造函数?

    结构体派生自ValueType,ValueType派生自Object,可访问Object的方法.结构体是一种缩小版的类.结构体不能继承.结构体总是有一个无参数的默认构造函数,不允许替换.结构体可指定字 ...

  3. Android 自学之网格试图(GridView)和图片切换器(ImageSwitcher)功能和用法

    网格试图(GridView)用于在界面上按行,列分布的方式来显示多个组件. GridView和ListView有共同的父类:AbsListView,因此GridView和ListView具有一定的相似 ...

  4. The _imageingft C module is not installed

    遇到的问题如图所示,使用的方法: 下载地址:http://effbot.org/downloads 并没有解决,有人用这样的方法成功了,只能说很遗憾,我并没有成功 大神给的解决办法,不要再win平台下 ...

  5. 消息推送SignalR

    一.什么是 SignalR ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of add ...

  6. 技术博客rss订阅源收集

        http://blog.sina.com.cn/rss/2506410862.xml http://fullrss.net/a/http/www.cocoachina.com/cms/rss. ...

  7. JavaScript学习笔记(12)——JavaScript内置对象

    1.Number Javascript只有一种数字类型,可以有小数也可以没有,也可以使用科学计数法. var z=123e-5; // 0.00123 JavaScript 不是类型语言.与许多其他编 ...

  8. 简单快速的伪Fractional Cascading

    Fractional Cascading算法是用于将零散的多个数组(亦可理解成比较高维的空间)中的数据的二分查找速度增加,用的是空间换时间的方法.然而这种方法并不是很好懂,而且中文文献很少.在这里介绍 ...

  9. 04_例子讲解:rlViewDemo.exe

    参考资料:http://www.roboticslibrary.org/tutorials/first-steps-windows 使用rlViewDemo对应的快捷方式启动程序,可以看到如下界面: ...

  10. 我们一起学Windows Phone 8-01-开发环境搭建

    我们仅讨论Windows Phone 8的开发,不考虑兼容向下兼容.也不会提供任何盗版软件的下载.破解. 需要准备 知识:.NET相关开发经验,C#语言开发经验.如果有WPF或Silverlight开 ...