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. SQL_server 数据库备份信息查看

    select distinct s.database_name, s.first_lsn,s.last_lsn,s.database_backup_lsn,s.backup_finish_date,s ...

  2. 搭建yum源服务器

    在生产环境中,受到网络环境的影响,服务器可能带宽有限,连外网速度较慢或者局域网内的某些机器由于安全的限制,本身就不允许和外网和任何的连接.而这时候现在通过yum安装包或update包时就是一件比较麻烦 ...

  3. [改善Java代码]建议采用的顺序是 List<T>、List<?>、List<Object>

    建议98:建议采用的顺序是 List<T>.List<?>.List<Object> List<T>.List<?>.List<Obj ...

  4. 关于网络连接方式的总结(HostOnly,NAT....)

    真实的网络结构: 最左侧的电脑左侧的线代表,如果这台电脑有网卡的话可以去连接别的电脑. 在一台Windows中用VMware来安装一个Linux系统(用虚线的都代表不是真实的) 上图中的虚拟网关在哪里 ...

  5. 关于oracle误删数据的恢复

    与数据打交道,免不了会误删一些数据,之后还commit了,连回滚的机会都没了,而更糟糕的是你又没有备份,这种事终于在今天被我不幸的遇上了... 唯一一点值得欣慰的是,我删除表记录的时候,时间不长,一天 ...

  6. HttpClient(4.3.5) - Exception Handling

    HttpClient can throw two types of exceptions: java.io.IOException in case of an I/O failure such as ...

  7. Nginx - Additional Modules, Limits and Restrictions

    The following modules allow you to regulate access to the documents of your websites — require users ...

  8. sqlserver关于事务

    事务的四个特性: 原子性,一致性,持久性,隔离性 原子性: 原子性:表示事务执行是作为原子,不可分割,整个语句要么执行,要么不执行sqlserver中每一个单独的语句可以看做是包含在事务中每一句本身具 ...

  9. 有关开机后win7任务管理器不断重启的问题,我的情况是sendrpt.exe导致的(转载,有补充)

    SendRpt.exe提示SendRpt:Error资源管理器未响应 打开电脑就发现资源管理器就未响应,还发现一个标题为Report sending utility的SendRpt.exe进程占用CP ...

  10. iOS开发——锁屏监听

    公司所做的项目,锁屏监听是为了60秒后,解锁瓶后显示[手势解锁]或[指纹验证]: 第一步:AppDelegate.m 头部导入 #import <notify.h> #define Not ...