Это ещё одна функция, которая может значительно облегчить жизнь разработчику.
Слепим много кортежей в одну строку
Сравним два запроса:
Как видите, второй запрос агрегирует значения по правилу в GROUP BY
.
Что нам это даёт? Посмотрим:
Отлично.
Более того, хотите составить динамический запрос по копированию данных из одной таблицы в другую? Просто перечисляйте колонки отсюда вкупе с любым INSERT
и SELECT
.
Откуда ноги растут
Оригинальный код взят здесь. В сообщении практически разжёван механизм агрегирования в MS SQL для CLR:
init
новой группы;accumulate
новых значений;merge
с группой;terminate
группу;read
иwrite
для сериализации.
В чём разница?
Механизм работал не всегда. Вы ожидали, что он вернёт a,b,c,d,e,f
, но он выдавал a,b,cd,e,f
— по странным причинам. Это проявлялось на объёмных выборках: есть предположение, что замешана многопоточность. Решилось копированием разделителя из соседних групп.
Свойства функции:
IsInvariantToNulls = true
: пустые значения не влияют на результатIsInvariantToDuplicates = false
: дубликаты влияют на результатIsInvariantToOrder = false
: порядок влияет на результат
Если считаете функцию полезной, добро пожаловать.