SQL Server中的聚合,常用的比如max,count之类。 我们现在也可以在SQLCLR里创建自定义的聚合。Visual Studio 2005中提供的聚合模板是一个结构,标注了[Serializable],[SqlUserDefinedAggregate]标签,这将让SQLCLR知道这是一个聚合函数。
看一段代码,这段代码来自SQL Server 2005联机丛书,本来自己想写一段,但突然公司有些事要做,没时间了。示例代码作用是合并同一部书(ID相同)的作者。

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());
    }
}

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

CREATE TABLE BookAuthors
(
   BookID   int       NOT NULL,
   AuthorName    nvarchar(200) NOT NULL
)

INSERT BookAuthors VALUES(1, 'Johnson')
INSERT BookAuthors VALUES(2, 'Taylor')
INSERT BookAuthors VALUES(3, 'Steven')
INSERT BookAuthors VALUES(2, 'Mayler')
INSERT BookAuthors VALUES(3, 'Roberts')
INSERT BookAuthors VALUES(3, 'Michaels')
SELECT BookID, dbo.MyAgg(AuthorName)
FROM BookAuthors
GROUP BY BookID

结果如下

BookID Author Names

1

Johnson

2

Taylor, Mayler

3

Roberts, Michaels, Steven

Microsoft SQL Server Management Studio为我们提供了数据库内对象的集中管理功能,前面几篇创建的SQLCLR对象,都可以在数据库的可编程性下相应模块里找到。

这一系列到此就算是结束了,谢谢大家。

转载于:https://www.cnblogs.com/wayne-ivan/archive/2007/06/19/788555.html

SQLCLR(五)聚合相关推荐

  1. Maven学习总结(五)——聚合与继承

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1. ...

  2. mysql 聚合函数求乘积_手把手教你mysql(五)聚合函数

    手把手教你mysql(五)聚合函数 一: 聚合函数 1.1.COUNT()函数 1. COUNT()函数用来统计记录的条数: 2. 与GOUPE BY 关键字一起使用: 我这边仍然使用的是t_stud ...

  3. Maven学习总结(5)——聚合与继承

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1. ...

  4. 全球与中国聚合支付平台市场深度研究分析报告

    [报告篇幅]:112 [报告图表数]:142 [报告出版时间]:2022年3月 报告摘要 本文研究全球及中国市场聚合支付平台现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美.欧洲.中 ...

  5. jmeter 聚合报告说明_jmeter 监听器聚合报告说明:

    Label:每个JMeter的element的Name值.例如HTTP Request的Name. Samples:表示这次测试中一共发出了多少个请求.线程组中配置的是,线程数为200,循环次数为50 ...

  6. 从壹开始微服务 [ DDD ] 之一 ║ D3模式设计初探 与 我的计划书

    缘起 哈喽大家周四好!又是开心的一天,时间过的真快,我们的 <从壹开始 .net core 2.1 + vue 2.5 >前后端分离系列共 34 篇已经完结了,当然以后肯定还会有更新和修改 ...

  7. oracle 查询天,Oracle查询_ 单表查询

    前面我们详解了关于Oracle的增删改,今天让我们接着来学习Oracle的查询吧, Oracle中查询可是重头戏噢!!!跟着煌sir的步伐,走位,走位~~~ 小知识锦囊 在此前,先讲解一个小知识点 O ...

  8. Maven学习(一)——Maven入门

    为什么80%的码农都做不了架构师?>>>    一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服 ...

  9. java模块_Java 9 揭秘(2. 模块化系统)

    文 by / 林本托 Tips 做一个终身学习的人. 在此章节中,主要介绍以下内容: 在JDK 9之前Java源代码用于编写,打包和部署的方式以及该方法的潜在问题 JDK 9中有哪些模块 如何声明模块 ...

  10. sql取整数_SQL 窗口函数

    一 什么是窗口函数 窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理. 基本语法 ‹窗口函数› over (pa ...

最新文章

  1. 物联网和前端技术,两者相辅相成并且互相促进 —— 阿里云 MVP 黄强专访
  2. 如何快速学好Shell脚本?
  3. python 立方体_Python | 创建三个数字列表,分别是正方形和立方体
  4. 关闭IOS更新功能(ios4/5/6)
  5. my batis plus 小数没有0_大黄蜂3号Plus,妈咪保贝的强劲对手!
  6. Java新特性之Nashorn的实例详解
  7. 在React中加载数据:redux-thunk,redux-saga,suspense,hooks
  8. IDEA控制台问题:At least one JAR was scanned for TLDs yet contained no TLD
  9. 华为-2025十大趋势:智能世界,触手可及.pdf(附下载链接)
  10. 蓝桥杯省赛2014年Java组B组
  11. 软件工程 第4版张海藩 pdf_2019年第4期软件工程造价师培训课程圆满结束
  12. Theano入门神经网络(三)
  13. 斯蒂夫乔布斯传札记:第八波
  14. 给ImageView做圆角处理
  15. 如何自建微信外卖平台_怎么做微信外卖小程序_微信外卖小程序创建图文教程...
  16. matplotlib画图(一)——线条图
  17. A.C.E的JAVA学习笔记--5/14/21
  18. wopus推荐码,购买立省五块钱!!
  19. uni-app - Refused to display ‘xxx‘ in a frame because an ancestor violates the following Content Sec
  20. java mycat reload_MyCAT 1.6 使用reload @@config_all报错

热门文章

  1. 工作进度总结汇报01
  2. 掌握JAVA多线程的利器-线程池
  3. PHP支付宝接口RSA验证
  4. linux下软链接与硬链接
  5. sicily 1150. 简单魔板
  6. material mem
  7. b站编程课程资源汇总
  8. 后盾网lavarel视频项目---4、lavarel和vue都是{{}}表示变量,如何解决冲突
  9. 刷题练习记录(3)——无重复字符的最长子串(JAVA 和 Python)——set()函数/集合...
  10. 第六章 Realm及相关对象(四) PrincipalCollection