🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: cn.bbs.comp.database
Article #192

�� C# ���� SQL Server 2005 ���Զ���ۺϺ��� zz

#192
From: Dem����ɫ�н�����
Date: Sat, 25 Jul 2009 04:41
114 lines
5044 bytes
http://www.cnblogs.com/RChen/archive/2006/11/15/sql2k5_clr.html

�� SQL �У�������Ҫ����ݰ�������Զ���ľۺϲ����������ö�������һϵ�б�ʾ 
ID �����֣���Ĭ��ֻ�� SUM, MAX, MIN, AVG �ȾۺϺ����� SQL Server 2005 ����
���˱�д CLR ���йܴ����֧�֣����ǿ�������д�Զ���ľۺϺ���
�������������ݣ�

Age Name 
20 ���� 
21 ���� 
20 ���� 
22 ���� 
18 Ǯ�� 

������õ�

Age Name 
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
}

���ﲻ������ϸ�IJ������裬����Ӧ�ÿ����ѵ��ܶࡣ
��ԭ���Ǹ������ṩ�˼���ģ�淽����Init(), Accumulate(), Merge(), 
Terminate().
������Ҫ������������д�Լ��ľۺ��߼����ɡ��⼸�������ĺ���ֱ��dz�ʼ����ɨ��
��һ����¼ʱ���ϲ�����ֹɨ�衣

��Ҫע�����¼��㣺

1. �Զ���ۼ������У����Ƿ��ص���ݻᱻ���л�Ȼ��ת���� SQL Server �У���һЩ
��ֵ���� Framework �ṩ��Ĭ�ϵ����л����ƣ�������һЩ CLR �����ͱ��� string 
�ͱ����Լ�ʵ�����л����ƣ�Ҳ����ʵ�� IBinarySerialize �ӿڡ�

2. ����ֵ�� SQL Server �ﶨ��ı���һ���ܵ� 8000 �ֽڵij������ơ�

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://bbs.sjtu.edu.cn/file/comic/122390669464913.jpg

�� ��Դ:����ˮ˼Դ bbs.sjtu.edu.cn��[FROM: 58.35.145.142]
Technical Details
Message-ID: <4h9AFj$cCX@bbs.sjtu.edu.cn>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news2.google.com!news.glorb.com!newsgate.cuhk.edu.hk!news.cn99.com!news.shec6.edu.cn!SJTU

Show Full Headers
Complete Article Headers
X-Google-Thread: 4df683fd51,81235f7dc7bc4cf0,start
X-Google-Attributes: gid4df683fd51,public,usenet
X-Google-NewGroupId: yes
X-Google-Language: Chinese,GB
Path: arc1-ca.pugleaf.net!g2news2.google.com!news2.google.com!news.glorb.com!newsgate.cuhk.edu.hk!news.cn99.com!news.shec6.edu.cn!SJTU
From: ZAKU.bbs@bbs.sjtu.edu.cn (Dem����ɫ�н�����)
Newsgroups: cn.bbs.comp.database
Subject: �� C# ���� SQL Server 2005 ���Զ���ۺϺ��� zz
Date: 25 Jul 2009 04:41:45 GMT
Organization: ��ˮ˼Դ
Message-ID: <4h9AFj$cCX@bbs.sjtu.edu.cn>
Mime-Version: 1.0
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 8bit
X-Filename: database/M.1248496893.A