sql >> Databáze >  >> RDS >> Sqlserver

Je možné použít uživatelem definované agregáty (clr) s funkcemi okna (over)?

Máš pravdu, že je složité něco v dokumentaci najít. Ale při hledání na webu Connect se mi podařilo najít tento klenot:

Dnes můžete používat agregáty CLR s klauzulí OVER a PARTITION BY stejně jako běžné agregační funkce. Jakmile budeme mít podporu pro funkce okna...

Což byla odpověď od Microsoftu.

Když jsem však čekal, až můj starý počítač vytvoří nový databázový projekt a vytvoří tento agregát, dělal jsem vyhledávání na webu Connect:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined,MaxByteSize = 2000)]
public struct SqlAggregate1 : IBinarySerialize
{
    private SqlString last;
    public void Init()
    {
        // Ignore
    }

    public void Accumulate(SqlString Value)
    {
        last = Value;
    }

    public void Merge (SqlAggregate1 Group)
    {
        // Ignore
    }

    public SqlString Terminate ()
    {
        // Put your code here
        return last;
    }

    public void Read(BinaryReader r)
    {
        last = new SqlString(r.ReadString());
    }

    public void Write(BinaryWriter w)
    {
        w.Write(last.ToString());
    }
}

A pak spusťte tento skript:

select dbo.SqlAggregate1(Column2) OVER (PARTITION BY Column1)
from (select 1,'abc' union all select 1,'def' union all
      select 2,'ghi' union all select 2,'jkl') as t(Column1,Column2)

Což produkuje:

------------
abc
abc
ghi
ghi

Což je daleko – odpověď jste mohli snadno objevit sami, když jste to zkusili to.




  1. Jaký význam má předpona N v příkazech T-SQL a kdy ji mám použít?

  2. Oracle – Proč bych měl používat balíčky místo samostatných procedur nebo funkcí

  3. Hostingový balíček na Chocolatey

  4. SQL Query pro zřetězení hodnot sloupců z více řádků v Oracle