亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用 C# 開發 SQL Server 2005 的自定義聚合函數

2019-11-18 16:52:54
字體:
來源:轉載
供稿:網友

在 SQL 中,經常需要對數據按組進行自定義的聚合操作,比如用逗號連接一系列表示 ID 的數字,但默認只有 SUM, MAX, MIN, AVG 等聚合函數。在 SQL Server 2005 中提供了編寫 CLR 的托管代碼的支持,我們可以用來寫自定義的聚合函數。
比如對于如下數據:

AgeName
20張三
21李四
20王二
22趙五
18錢六

我們想得到

AgeName
18錢六
20張三,王二
21李四
22趙五
需要實現一個聚合函數 StrJoin, 其功能是用逗號連接字符串。
預期的 SQL 語句如下:
select
    Age,
    dbo.StrJoin(Name) as Name
from
    SomeTable
要實現這個函數,用 Visual Studio 2005 建立一個 C# 的 Database 項目,項目模版選擇 SQL Server 數據庫。在項目管理器里添加一個 Aggregate 后,輸入代碼如下:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,
    IsInvariantToDuplicates=false,
    IsInvariantToNulls=true,
    IsInvariantToOrder=false,
    IsNullIfEmpty=true,
    MaxByteSize=8000
)]
public struct StrJoin: IBinarySerialize {
    PRivate StringBuilder _result;

    public void Init() {
        _result = new StringBuilder();
    }

    public void Accumulate(SqlString Value) {
        if (Value.IsNull) {
            return;
        } else {
            if (_result.Length > 0)
                _result.Append(",");
            _result.Append(Value.Value);
        }
    }

    public void Merge(StrJoin Group) {
        _result.Append(Group._result);
    }

    public SqlString Terminate() {
        if (_result.Length > 0) {
            return new SqlString(_result.ToString());
        }
        return new SqlString("");
    }

    #region IBinarySerialize Members

    public void Read(System.IO.BinaryReader r) {
        _result = new StringBuilder(r.ReadString());
    }

    public void Write(System.IO.BinaryWriter w) {
        w.Write(_result.ToString());
    }

    #endregion
}

這里不敘述詳細的操作步驟,網上應該可以搜到很多。
其原理是該類中提供了幾個模版方法:Init(), Accumulate(), Merge(), Terminate().
我們需要做的是在其中寫自己的聚合邏輯即可。這幾個方法的含義分別是初始化,掃描到一條記錄時,合并,終止掃描。

需要注意以下幾點:

1. 自定義聚集函數中,我們返回的數據會被序列化然后轉換到 SQL Server 中,對一些數值類型 Framework 提供了默認的序列化機制,但其他一些 CLR 的類型比如 string 就必須自己實現序列化機制,也就是實現 IBinarySerialize 接口。

2. 返回值和 SQL Server 里定義的變量一樣,受到 8000 字節的長度限制。

3. SQL Server 2005 必須設置兼容性級別為 "SQL Server 2005(90)", 否則會出現如下錯誤:
 'EXTERNAL' 附近有語法錯誤。您可能需要將當前數據庫的兼容級別設置為更高的值,
以啟用此功能。有關存儲過程 sp_dbcmptlevel 的信息,請參見幫助。
4. 需要開啟 SQL Server 2005 對 CLR 的支持(如果沒有打開的話)。
執行如下命令:
EXEC sp_configure 'clr enabled', 1
RECONFIGURE WITH OVERRIDE
GO

http://www.49028c.com/RChen/archive/2006/11/15/sql2k5_clr.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文在线视频| 国产精品久久久久久一区二区| 欧美国产视频日韩| 国精产品一区一区三区有限在线| 久久在线精品视频| 中文字幕在线观看亚洲| 欧美另类在线播放| 欧美日韩国产丝袜另类| 亚洲伊人成综合成人网| 在线观看欧美成人| 啊v视频在线一区二区三区| 亚洲91精品在线观看| 91中文字幕一区| 国产精品嫩草视频| 亚洲欧美综合图区| 欧美一区二区视频97| 亚洲新中文字幕| 91精品国产综合久久香蕉的用户体验| 在线成人激情黄色| 在线日韩第一页| 国产精品 欧美在线| 亚洲天堂第二页| 亚洲精品99999| 欧美乱大交做爰xxxⅹ性3| 久久精品在线播放| 96pao国产成视频永久免费| 永久免费毛片在线播放不卡| 97精品久久久中文字幕免费| 日韩www在线| 91黑丝高跟在线| 久久久久久久久网站| 亚洲国产天堂久久综合网| 久久久久久久香蕉网| 欧美性高潮床叫视频| 久久亚洲精品国产亚洲老地址| 亚洲男女性事视频| 欧美一级视频免费在线观看| 日韩成人性视频| 久久久精品免费视频| 亚洲性夜色噜噜噜7777| 亚洲成在人线av| 91av在线影院| 国产精品永久在线| 日韩中文在线观看| 成人免费视频a| 欧美乱大交做爰xxxⅹ性3| 久久国产精品网站| 日韩av理论片| 欧美性生活大片免费观看网址| 尤物九九久久国产精品的分类| 狠狠躁18三区二区一区| 亚洲自拍偷拍色片视频| 国产精品激情av在线播放| 久久精品久久久久电影| 久久精品2019中文字幕| 在线精品播放av| 超碰日本道色综合久久综合| 国产精品国产自产拍高清av水多| 国产成人精品久久久| 亚洲永久在线观看| 亚洲国产精品一区二区三区| 国产激情综合五月久久| 久久久精品在线| 日本欧美一二三区| 国产亚洲欧美aaaa| 成人黄色中文字幕| 亚洲**2019国产| 日韩中文字幕久久| 这里只有精品丝袜| 亚洲美女黄色片| 日韩电影中文字幕在线| 久久国产精品首页| 日本国产高清不卡| 欧美大学生性色视频| 欧美激情小视频| 亚洲毛茸茸少妇高潮呻吟| 日本最新高清不卡中文字幕| 国产精品普通话| 一个色综合导航| 精品久久中文字幕久久av| 国产精品成人一区二区三区吃奶| 成人午夜激情免费视频| 国产亚洲精品综合一区91| 国产精品入口夜色视频大尺度| 成人免费直播live| 亚洲精品一区中文字幕乱码| www.久久色.com| 中文字幕自拍vr一区二区三区| 精品久久久久国产| 国产女人18毛片水18精品| 成人国内精品久久久久一区| 亚洲精品一区在线观看香蕉| 亚洲精品中文字| 夜夜狂射影院欧美极品| 日本午夜精品理论片a级appf发布| 亚洲人成电影网站色www| 欧美成人免费在线观看| 欧美成人精品在线播放| 亚洲精品98久久久久久中文字幕| 国产精品一二区| 欧美性猛xxx| 精品视频在线播放| 久久久久久12| 国产精品视频最多的网站| 亚洲综合中文字幕在线| 粗暴蹂躏中文一区二区三区| 亚洲激情自拍图| 亚洲free性xxxx护士hd| 亚洲一区二区久久| 欧美日韩亚洲视频| 国产99久久精品一区二区永久免费| 日韩在线www| 最近中文字幕日韩精品| 在线播放日韩专区| 992tv在线成人免费观看| 国产狼人综合免费视频| 色播久久人人爽人人爽人人片视av| 欧美视频中文在线看| 亚洲高清久久网| 久久香蕉频线观| 成人黄色在线观看| 91老司机在线| 亚洲图片欧洲图片av| 国产乱肥老妇国产一区二| 国产精品久久久久福利| 亚洲国产精品va在看黑人| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美激情精品久久久久| 国产精品视频一区国模私拍| 久久天天躁狠狠躁夜夜躁2014| 亚洲国产欧美一区二区三区久久| 亚洲欧美综合区自拍另类| 伦伦影院午夜日韩欧美限制| 视频一区视频二区国产精品| 亚洲精品国产精品国自产观看浪潮| 日韩av手机在线| 久久精品久久久久电影| 欧美疯狂xxxx大交乱88av| 久久夜色撩人精品| 亚洲成人免费在线视频| 欧美性xxxxx| 久久69精品久久久久久久电影好| 日韩黄在线观看| 91手机视频在线观看| 一本一本久久a久久精品牛牛影视| 日韩成人在线视频网站| 日韩电影中文字幕| 这里只有精品在线观看| 亚洲欧美激情另类校园| 欧美精品videofree1080p| 精品一区精品二区| 亚洲va男人天堂| 91视频88av| 欧美福利在线观看| 亚洲影院污污.| 91精品视频在线播放| 国产精品久久久久久五月尺| 欧美激情xxxx性bbbb| 69久久夜色精品国产69| 亚洲精品电影在线观看| 欧美激情三级免费| 日韩欧美成人区| 伊人久久精品视频| 国产精品视频一区二区高潮|