开发CLR数据库对象:CLR聚合功能(上)

日期: 2009-10-29 作者:McGraw-Hill翻译:冯昀晖 来源:TechTarget中国 英文

CLR聚合是SQL Server 2005引入的另一新的.NET数据库对象类型。本质上,自定义聚合功能是处理查询过程中对聚合数据分组用法的一个扩展功能。SQL Server一直提供有我们可以在查询中使用的聚合功能,例如:MIN,MAX和SUM。自定义聚合功能使我们可以用自定义的聚合功能扩展原来的聚合功能。

CLR聚合是一个非常好用的功能,支持创建对CLR自定义类型的聚合函数。与原生聚合函数一样,自定义聚合支持你对一组数据执行计算并返回单个值的功能。在创建CLR聚合时,你需要提供执行聚合的功能逻辑。在本节中,你将看到怎样创建一个简单的聚合功能,计算一组数字的最大差值。

  要使用Visual St……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

CLR聚合是SQL Server 2005引入的另一新的.NET数据库对象类型。本质上,自定义聚合功能是处理查询过程中对聚合数据分组用法的一个扩展功能。SQL Server一直提供有我们可以在查询中使用的聚合功能,例如:MIN,MAX和SUM。自定义聚合功能使我们可以用自定义的聚合功能扩展原来的聚合功能。CLR聚合是一个非常好用的功能,支持创建对CLR自定义类型的聚合函数。与原生聚合函数一样,自定义聚合支持你对一组数据执行计算并返回单个值的功能。在创建CLR聚合时,你需要提供执行聚合的功能逻辑。在本节中,你将看到怎样创建一个简单的聚合功能,计算一组数字的最大差值。

  要使用Visual Studio 2005创建聚合功能,你要点击“新建|项目”选项,指定项目名称,然后点击“确定”创建项目。本例中使用的名称为“MaxVariance”。在给项目命名,点击确定之后,使用你需要的连接配置完成“新建数据库引用”对话框,指向你的SQL Server服务器和数据库。接下来,为了创建聚合功能,我点击“项目|添加聚合”选项,显示“添加新项目”对话框。如图3-12所示:

  图3-12:创建CLR聚合功能

  在SQL Server模板列表中选择“聚合Aggregate”,然后输入类名,点击“确定”。如图3-12所示:我使用的名称是“MaxVariance”。Visual Studio会给聚合类生产启动项目。与自定义类型相似,SQL Server CLR聚合功能模板实现了SQL Server 2005对所有CLR聚合功能需要的四个方法。这四个必须实现的方法都列举在了下表3-3中。

  表3-3:必须实现的聚合功能方法

  你可以看到实现“MaxVariance”聚合功能的代码。如下所示:

  Imports System
  Imports System.Data
  Imports System.Data.Sql
  Imports System.Data.SqlTypes
  Imports Microsoft.SqlServer.Server
  _
  _
  Public Structure MaxVariance
  Public Sub Init()
  m_LowValue = 999999999
  m_HighValue = -999999999
  End Sub
  Public Sub Accumulate(ByVal value As Integer)
  If (value > m_HighValue)
  m_HighValue = value
  End If
  If (value < m_LowValue)
  m_LowValue = value
  End If
  End Sub
  Public Sub Merge(ByVal Group as MaxVariance)
  If (Group.GetHighValue() > m_HighValue)
  m_HighValue = Group.GetHighValue()
  End If
  If (Group.GetLowValue() < m_LowValue)
  m_LowValue = Group.GetLowValue()
  End If
  End Sub
  Public Function Terminate() As Integer
  return m_HighValue - m_LowValue
  End Function
  ' Helper methods
  Private Function GetLowValue() As Integer
  return m_LowValue
  End Function
  Private Function GetHighValue() As Integer
  return m_HighValue
  End Function
  ' This is a place-holder field member
  Private m_LowValue As Integer
  Private m_HighValue As Integer
  End Structure

  在这段代码的顶部,你可以看到标准的导入语句集,它们都是CLR对象需要使用的,下面是CLR聚合功能对象需要使用的序列化属性。在那些代码后面,在“Init”方法内有两个参数,“m_LowValue”和“m_HighValue”,分别被赋予高值和低值,确保它们从列表中得到赋值。这两个变量是在代码中靠近底部的位置声明的,它们用来保存聚合程序遇到的最小值和最大值。“Init”方法只被调用一次,就是在对象第一次初始化的时候被调用。

  虽然“Init”方法只被调用一次,但“Accumulate”方法会对结果集中的每一行调用一次。在本例中,“Accumulate”方法把新值与存储在“m_HighValue”和“m_LowValue”中的值相比较。如果新值比当前较高的值更大,就把新值存储在“m_HighValue”变量中。如果该新值比“m_LowValue”的值要小,就把该值存储在“m_LowValue”变量中。

  “Merge”方法用在聚合功能并行处理的情况,一般大部分查询都不是如此。如果“Merge”方法被调用,它的任务是从并行实例中导入当前聚合功能值。在本例中你可以看到,它使用两个帮助函数(本质就就是导出“m_HighValue”和“m_LowValue”变量的值)来做到这一点。

  “Terminate”方法在所有结果被处理完之后调用一次。在本例中,“Terminate”方法简单地把找到的最大值减去找到的最小值,把它们的差值返回给调用者。

相关推荐