sql >> Databasteknik >  >> RDS >> Sqlserver

Är det möjligt att använda användardefinierade aggregat (clr) med fönsterfunktioner (över)?

Du har rätt i att det är knepigt att hitta något i dokumentationen. Men när jag sökte på Connect-webbplatsen lyckades jag hitta denna pärla:

Idag kan du använda CLR-aggregat med OVER-sats och PARTITION BY precis som vanliga aggregatfunktioner. När vi väl har stöd för fönsterfunktioner...

Vilket var ett svar från Microsoft.

Men att söka på Connect-webbplatsen var vad jag gjorde medan jag väntade på att min gamla dator skulle skapa ett nytt databasprojekt och skapa detta aggregat:

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());
    }
}

Och kör sedan det här skriptet:

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)

Som producerar:

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

Vilket är långt att säga - du kunde lätt ha upptäckt svaret själv bara genom att försöka det.




  1. Formatera ett tal som valuta i SQLite

  2. Vad är det verkliga värdet av att ta in Microsoft Access i din organisation?

  3. Dapper.NET och lagrad proc med flera resultatuppsättningar

  4. Hur ändrar jag standardspråk för SQL Server?