Замена STRING_AGG в SQL Server 2016

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

SELECT concat('TNB/IAG/',STRING_AGG(WF_ValStr, '/')) AS Result
    FROM wfattrdata where wf_id=35262472 and  WF_AttrID in (28,29,30,31,33);

Я мог бы получить ожидаемый результат ниже в последних версиях MSSql.

TNB/IAG/1/2/3/4/5

Как заменить приведенный выше запрос, чтобы он работал в SQL Server 2016?


person eshaa    schedule 07.10.2019    source источник
comment
Существует много повторяющихся вопросов, которые показывают, как использовать трюки с XML или пользовательскими функциями SQLCLR. Все они, так или иначе, описывают одну из техник в Групповая конкатенация в SQL Server.   -  person Panagiotis Kanavos    schedule 07.10.2019
comment
С другой стороны, хранение значений атрибутов в отдельных строках на самом деле является проблемой дизайна. Вместо гибкости вы теряете возможность легко запрашивать данные и в конечном итоге теряете производительность. SQL Server поддерживает тысячи столбцов через разреженные столбцы. Вы можете легко хранить частично структурированные данные с помощью XML или JSON, индексировать их и быстро запрашивать.   -  person Panagiotis Kanavos    schedule 07.10.2019
comment
@PanagiotisKanavos Я не хочу использовать функцию и пытаюсь агрегировать только один столбец. Страница, которой вы поделились, предназначена для объединения двух столбцов на основе идентификатора и значений.   -  person eshaa    schedule 07.10.2019
comment
Наоборот, он описывает, как агрегировать столбцы. Именно то, что делает STRING_AGG. На самом деле, попытка агрегировать несколько столбцов — это настоящая боль без STRING_AGG.   -  person Panagiotis Kanavos    schedule 07.10.2019
comment
Проверьте только что опубликованный ответ, например. Это техника XML PATH, описанная в статье Аарона Бертрана. Я не могу не подчеркнуть это достаточно - все ответы, которые вы найдете, взяты из этой статьи.   -  person Panagiotis Kanavos    schedule 07.10.2019
comment
Говоря о JSON, вы можете использовать FOR JSON и получить легко анализируемую строку JSON. Вы можете заменить скобки и кавычки, чтобы получить нужный формат, особенно если вы используете WITHOUT_ARRAY_WRAPPER, чтобы избавиться от оболочки массива.   -  person Panagiotis Kanavos    schedule 07.10.2019


Ответы (1)


Проверьте приведенный ниже код STUFF, XML -

SELECT DISTINCT CONCAT('TNB/IAG/',T1.results) AS EXPECTED_RESULT FROM
(
select REPLACE(STUFF(CAST((
                    SELECT   ' /' +CAST(c.WF_ValStr AS VARCHAR(MAX))
                    FROM (  
                            SELECT distinct WF_ValStr
                            FROM wfattrdata
                        ) c
                    FOR XML PATH(''), TYPE) AS VARCHAR(MAX)), 1, 2, ''),' ','') AS results
                    from wfattrdata t) T1;
person Arulmouzhi    schedule 07.10.2019