Порой возникает насущная необходимость отобразить некую последовательность, ну например список номеров вагонов в составе, номеров телефонов организации или мест в ряду кинотеатра. Задача, на первый взгляд, простая и уже много где описанная. Но... Не всегда эта последовательность непрерывна и не всегда она состоит из целочисленных значений. Поэтому...
<зануда mode on>Как известно, вариантов решения несколько: можно использовать функцию string_agg (что длинно и результат не всегда читаем, т.к. порой получается такая "портянка", что только успевай подносить свежие картриджи к принтеру), собрать диапазоны в цикле или курсоре (долго и не очень надежно, хотя когда-то довольствовались и этим), написать свою агрегатную функцию CLR (зачастую невозможно, потому-что сисадмины не спят!). Данные варианты, пожалуй, описывать не буду. Потому что. Потому что они уже много где описаны.<зануда mode off>
...поэтому берем, и пишем обёртку в виде функции под уже существующий агрегат. В данном случае под тот самый string_agg, решая при этом практически все основные минусы классических методов: не будет портянки-перечисления, курсор не уйдёт в бесконечный цикл (цикл, впрочем, тоже) так как их не будет, не придётся задабривать админов для установки CLR-обработчика собственной агрегатной функции.
Как это работает. Думаю, должно быть понятно из комментариев к коду. Если нет - спрашивайте.
Ну и как пользоваться данной функцией: