sql >> Base de Datos >  >> RDS >> Sqlserver

¿Es posible usar agregados definidos por el usuario (clr) con funciones de ventana (sobre)?

Tienes razón en que es complicado encontrar algo en la documentación. Pero buscando en el sitio web de Connect, logré encontrar esta joya:

Hoy en día, puede usar agregados CLR con cláusula OVER y PARTITION BY al igual que las funciones agregadas normales. Una vez que tengamos soporte para funciones de ventana...

Que fue una respuesta de Microsoft.

Sin embargo, buscar en el sitio de Connect fue lo que hice mientras esperaba que mi vieja máquina creara un nuevo proyecto de base de datos y creara este agregado:

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

Y luego ejecute este script:

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)

Que produce:

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

Lo cual es un largo camino para decirlo:podrías haber descubierto fácilmente la respuesta por ti mismo con solo intentar eso.