日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLCLR(五)聚合

發(fā)布時間:2025/7/14 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLCLR(五)聚合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
SQL Server中的聚合,常用的比如max,count之類。 我們現在也可以在SQLCLR里創(chuàng)建自定義的聚合。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為我們提供了數據庫內對象的集中管理功能,前面幾篇創(chuàng)建的SQLCLR對象,都可以在數據庫的可編程性下相應模塊里找到。

這一系列到此就算是結束了,謝謝大家。

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

總結

以上是生活随笔為你收集整理的SQLCLR(五)聚合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。