SqlServerCLR聚合函數:分組連接字符串


    今天在開源社區看到某個人問如何將表里某列字符串按照group by的分組連接成一個字符串,相當於字符串版的sum函數。想了半天沒想出好辦法。最后突然想起來SqlServer可以用CLR寫函數,所以用C#寫了個聚合函數。代碼基本參考了msdn上下面的例子,喜歡原版的可以直接看msdn:
    http://msdn.microsoft.com/zh-cn/library/ms131056.aspx

    折騰步驟:

  1. 在VS2010里面創建一個Visual C# Sql CLR 數據庫項目(數據庫=>SQL Server=>C# Sql CLR 數據庫項目),創建提示中需要輸入數據庫信息。
    注意將.Net Framework改成3.5版本,我的數據庫是2008,最高支持到3.5,未來2012應該會支持.Net4.0。
  2. 添加一個聚合函數JoinStr.cs: 
    聚合函數
     1 using System;
    2 using System.Data;
    3 using System.Data.SqlClient;
    4 using System.Data.SqlTypes;
    5 using Microsoft.SqlServer.Server;
    6 using System.Collections.Generic;
    7 using System.Text;
    8
    9
    10 [Serializable]
    11 [SqlUserDefinedAggregate(
    12 Format.UserDefined, //use clr serialization to serialize the intermediate result
    13 IsInvariantToNulls = true, //optimizer property
    14 IsInvariantToDuplicates = false, //optimizer property
    15 IsInvariantToOrder = false, //optimizer property
    16 MaxByteSize = 8000) //maximum size in bytes of persisted value
    17 ]
    18 public class JoinStr : IBinarySerialize
    19 {
    20 private StringBuilder _strBuilder;
    21 public void Init()
    22 {
    23 _strBuilder = new StringBuilder();
    24 }
    25
    26 public void Accumulate(SqlString Value)
    27 {
    28 if (String.IsNullOrEmpty(Value.Value)) return;
    29
    30 _strBuilder.Append(Value.Value + "");
    31 }
    32
    33 public void Merge(JoinStr Group)
    34 {
    35 _strBuilder.Append(Group._strBuilder);
    36 }
    37
    38 public SqlString Terminate()
    39 {
    40 string outPut = "";
    41 if (_strBuilder != null && _strBuilder.Length > 0)
    42 {
    43 outPut = _strBuilder.ToString(0, _strBuilder.Length - 2);
    44 }
    45
    46 return new SqlString(outPut);
    47 }
    48
    49 public void Read(System.IO.BinaryReader r)
    50 {
    51 _strBuilder = new StringBuilder(r.ReadString());
    52 }
    53
    54 public void Write(System.IO.BinaryWriter w)
    55 {
    56 w.Write(_strBuilder.ToString());
    57 }
    58 }
  3. 右擊項目點'生成',然后右擊點'部署'。直接F5也可以。
  4. 在VS的Test.sql里或者直接在SqlServer的管理界面里新建一個查詢,寫入下面的sql來啟用CLR功能並測試我們創建的函數:
    測試Sql
     1 --啟用CLR
    2 sp_configure 'clr enabled',1;
    3 reconfigure;
    4 --看看自己寫的程序集發布了沒有
    5 SELECT * FROM sys.assemblies;
    6
    7 --創建測試表
    8 IF OBJECT_ID('p', 'U') IS NOT NULL
    9 DROP TABLE p;
    10 create table p(num int, name varchar(50));
    11
    12 --插入測試數據
    13 insert into p values(1,'aa');
    14 insert into p values(1,'ab');
    15 insert into p values(2,'ba');
    16 insert into p values(2,'bb');
    17 insert into p values(2,'bc');
    18 --測試CLR聚合函數
    19 select num,dbo.JoinStr(name) from dbo.p group by num;
  5. 如果沒出什么意外的話會得到下面的結果:

    1 aa ab
    2 ba bb bc

     


       

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM