SQLCLR(五)聚合

2016-02-19 13:49 2 1 收藏

下面请跟着图老师小编一起来了解下SQLCLR(五)聚合,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】

  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')

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

SELECT BookID, dbo.MyAgg(AuthorName)
FROM BookAuthors
GROUP BY BookID

  结果如下

BookID Author Names

  1       Johnson

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  2       Taylor, Mayler

  3       Roberts, Michaels, Steven

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

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

来源:http://www.tulaoshi.com/n/20160219/1605313.html

延伸阅读
  RSS聚合器是一种特别适合于使用标准AJAX引擎进行构建的应用程序,然而,要实现对RSS回馈的跨域的AJAX请求往往是很难的。在本文中,我将向你展示如何利用一个简单的PHP函数来实现"桥接"AJAX引擎和RSS内容。 一、 引言 现在,开发一个RSS聚合器已经不再是困难的事情,但是开发一个高质量的RSS聚合器却仍然存在相当的难...
标签: Java JAVA基础
一:背景:Decorator *Decorator 常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator 模式中是必须的。 *Decorator 定义: 动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator 模式相比用生成子...
作为锂离子电池之后进行革新得到的新电池产品,锂聚合物电池在使用中有一些需要注意的地方。下面笔者给大家介绍一下锂聚合物电池保养方法。 首先,是锂聚合物电池的特点。相比较锂离子电池,锂聚合物电池改善了电池漏液的问题,但也并没有彻底的改善。此外锂聚合物电池能够制作成超薄型电池,0.5mm的厚度就可以达到3.6V400毫安时的容量,而且...
标签: SQLServer
一、 SQLCLR权限集级别 当你使用CREATE ASSEMBLY语句把一个程序集加载到一个数据库中时,SQL Server提供了三种权限集级别:SAFE,EXTERNAL_ACCESS和UNSAFE。这些权限集形成如图3和图5(均请参考 第二篇 )所示的AppDomain策略级别。 下面是一个典型的语句,它实现安装位于FileLoader.dll文件内的一个程序集,并且赋予它EXTERNAL_ACC...

经验教程

780

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部