Можно ли использовать определяемые пользователем агрегаты (clr) с оконными функциями (сверху)?

Можно ли использовать определяемые пользователем агрегаты (clr) с оконными функциями (сверху)?

Не могу найти ответ в документации: http://technet.microsoft.com/en-us/library/ms190678.aspx


person Roman Pokrovskij    schedule 12.03.2014    source источник


Ответы (1)


Вы правы, сложно найти что-либо в документации. Но при поиске на веб-сайте Connect мне удалось найти этот драгоценный камень< /а>:

Сегодня вы можете использовать агрегаты CLR с предложением OVER и PARTITION BY точно так же, как обычные агрегатные функции. Как только у нас появится поддержка оконных функций...

Это был ответ от Microsoft.


Тем не менее, поиск на сайте 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());
    }
}

А затем запустите этот скрипт:

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)

Что производит:

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

Это далеко не так - вы могли бы легко найти ответ для себя, просто попробовав его.

person Damien_The_Unbeliever    schedule 12.03.2014
comment
Но ни ORDER BY, ни ROWS, ни RANK не поддерживаются в предложении OVER. Это просто дает синтаксическую ошибку. - person Jens; 10.04.2015
comment
@Jens - все, что обещает элемент подключения MS, это PARTITION BY. И если вы рассмотрите, как определяются агрегаты CLR (особенно Merge), вы поймете, что в их текущей форме они не могут поддерживать эти другие части (мы теряем информацию о порядке). - person Damien_The_Unbeliever; 10.04.2015
comment
Я призываю людей голосовать за проблему с подключением так что Microsoft, скорее всего, когда-нибудь реализует это. - person MgSam; 24.08.2016
comment
Этот пример показывает, почему нет смысла без возможности заказа. Ваш результат предполагает определенный порядок, но на самом деле вы можете получить другой результат при другом исполнении, поскольку у вас нет столбца, который используется для упорядочения, и функция не выполняет никакого упорядочения. Я бы НЕ использовал эту функцию или подход, пока не будет поддержки функции Windows SQLCLR с ORDER BY и возможностью настройки окон. - person Ronen Ariely; 21.01.2021