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

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

        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

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

   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...

经验教程

192

收藏

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