powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Агрегатная функция CLR на C# сбоит
5 сообщений из 5, страница 1 из 1
Агрегатная функция CLR на C# сбоит
    #40061330
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите, пожалуйста

нашел в интернете код агрегатной функции, по инструкции скомпилировал и деплоил.
часто она работает без сбоев, но на больших массивах ведет себя не соответственно ожиданиям

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(

    Format.UserDefined, /// Binary Serialization because of StringBuilder
    IsInvariantToOrder = false, /// order changes the result
    IsInvariantToNulls = true,  /// nulls don't change the result
    IsInvariantToDuplicates = false, /// duplicates change the result
    MaxByteSize = -1
    )]

public struct concat_agg : IBinarySerialize   //  https://www.mssqltips.com/sqlservertip/2022/concat-aggregates-sql-server-clr-function/
{
    private StringBuilder _accumulator;
    private string _delimiter;

    /// <summary>
    /// IsNull property
    /// </summary>
    public Boolean IsNull { get; private set; }

    public void Init()
    {
        _accumulator = new StringBuilder();
        _delimiter = string.Empty;
        this.IsNull = true;
    }

    public void Accumulate(SqlString Value, SqlString Delimiter)
    {
        if (!Delimiter.IsNull
            & Delimiter.Value.Length > 0)
        {
            _delimiter = Delimiter.Value; /// save for Merge
            if (_accumulator.Length > 0) _accumulator.Append(Delimiter.Value);

        }
        _accumulator.Append(Value.Value);
        if (Value.IsNull == false) this.IsNull = false;
    }
    /// <summary>
    /// Merge onto the end 
    /// </summary>
    /// <param name="Group"></param>
    public void Merge(concat_agg Group)
    {
        /// add the delimiter between strings
        if (_accumulator.Length > 0
            & Group._accumulator.Length > 0) _accumulator.Append(_delimiter);

        ///_accumulator += Group._accumulator;
        _accumulator.Append(Group._accumulator.ToString());

    }

    public SqlString Terminate()
    {
        // Put your code here
        return new SqlString(_accumulator.ToString());
    }

    /// <summary>
    /// deserialize from the reader to recreate the struct
    /// </summary>
    /// <param name="r">BinaryReader</param>
    void IBinarySerialize.Read(System.IO.BinaryReader r)
    {
        _delimiter = r.ReadString();
        _accumulator = new StringBuilder(r.ReadString());

        if (_accumulator.Length != 0) this.IsNull = false;
    }

    /// <summary>
    /// searialize the struct.
    /// </summary>
    /// <param name="w">BinaryWriter</param>
    void IBinarySerialize.Write(System.IO.BinaryWriter w)
    {
        w.Write(_delimiter);
        w.Write(_accumulator.ToString());
    }
}



вызывается с двумя параметрами соответственно, указываю поле, которое нужно агрегировать в запросе SQL и делиметр.
Код: sql
1.
2.
3.
select 
fn_concatCLR(field, ', ') as fields
from Table



Проблема в том, что на больших массивах агрегация происходит, но делиметр исчезает. А иногда он есть...

Помогите, пожалуйста исправить ,что в коде не так. Совсем не знаток C#...

Спасибо огромное
...
Рейтинг: 0 / 0
Агрегатная функция CLR на C# сбоит
    #40061332
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

см. третий комментарий к статье с mssqltips.
...
Рейтинг: 0 / 0
Агрегатная функция CLR на C# сбоит
    #40061337
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

Спасибо добрый человек. Всё получилось!
...
Рейтинг: 0 / 0
Агрегатная функция CLR на C# сбоит
    #40064129
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще вопрос в рамках той же функции
как сделать, чтобы она не повторяла значения в агрегированной строке?
А перечисляла только уникальные значения

Спасибо
...
Рейтинг: 0 / 0
Агрегатная функция CLR на C# сбоит
    #40064133
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
еще вопрос в рамках той же функции
как сделать, чтобы она не повторяла значения в агрегированной строке?
А перечисляла только уникальные значения

Спасибо


сделайте distinct до аггрегата.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Агрегатная функция CLR на C# сбоит
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]