sql >> Database >  >> RDS >> Sqlserver

Is het mogelijk om door de gebruiker gedefinieerde aggregaten (clr) te gebruiken met vensterfuncties (over)?

Je hebt gelijk dat het lastig is om iets in de documentatie te vinden. Maar toen ik op de Connect-website zocht, vond ik dit juweeltje:

Tegenwoordig kunt u CLR-aggregaties met de clausule OVER en PARTITION BY gebruiken, net als reguliere aggregatiefuncties. Zodra we ondersteuning hebben voor vensterfuncties...

Dat was een reactie van Microsoft.

Zoeken op de Connect-site was echter wat ik deed terwijl ik wachtte tot mijn verouderde machine een nieuw databaseproject aanmaakte en dit aggregaat maakte:

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

En voer dan dit script uit:

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)

Wat produceert:

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

Dat is een lange weg om te zeggen - je had het antwoord gemakkelijk zelf kunnen ontdekken door proberen het.




  1. nulls gebruiken in een door mysqli voorbereide verklaring

  2. Update ListView op basis van door SQLite ondersteunde ContentProvider

  3. Plannen van schijfruimte voor databases

  4. Beheer wachtwoord en bronnen in Oracle met behulp van Profile