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. 最短路径之Dijkstra算法及实例分析

    Dijkstra算法迪科斯彻算法 Dijkstra算法描述为:假设用带权邻接矩阵来表示带权有向图.首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点Vi的最短路径.它的初始 ...

  2. Lombok(1.14.8) - @Log

    @Log @Logs,生成一个日志对象. package com.huey.lombok; import lombok.extern.java.Log; @Log public class LogEx ...

  3. Slickflow.NET 开源工作流引擎基础介绍(五) -- 会签加签高级特性介绍

    前言:会签和加签是常见审批流程模式,在引擎中,对这两种流程模式做了分别定义和实现,其中也用到了Workflow Pattern的Multiple Instance(多实例) . 1. 会签和加签的定义 ...

  4. C# 为网络程序添加用户代理

    如何为网络程序添加用户代理,本人推荐使用UrlMkSetSessionOption函数, 不过该函数有一个弱点不可以X64编译,X86编译软件才可以调用该函数 否则会一直返回!S_OK意义错误.第二呢 ...

  5. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  6. button按钮在IE6、7、8、9、10中处理方式并不相同[转]

    http://msdn.microsoft.com/en-us/library/ms534696%28v=vs.85%29.aspx 转自:http://my.oschina.net/fz04003/ ...

  7. js中元素操作的有关内容与对比

    以下 A:代表原生js B:代表jQuery 1 创建元素/节点 A: 元素节点- createElement( ) 文本节点 - createTextNode() 例如: var a = docum ...

  8. [Bootstrap]全局样式(五)

    辅助样式 1.情景文本色  .text-muted  .text-primary  .text-success  .text-info  .text-warning  .text-danger  {c ...

  9. Wininet笔记一

    1, InternetOpen 创建根句柄,由下一层的 InternetOpenUrl 和 InternetConnect 使用,而 InternetConnect 创建的句柄又被之后的几个函数使用. ...

  10. 利用AVL树实现搬箱问题的best fit策略

    //my.h //定义两个数据类型,货物Goods,箱子Box #include <vector> #include <cstddef> #include <iostre ...