STRING_AGG() to długo wyczekiwana funkcja. Konkurencja miała już ją od dawna. A my musieliśmy kombinować i stawiać protezy (recursive cte, xml, clr, meh..)
SQL Server 2017 (i Azure) nam wreszcie ją udostępnia. Warto jednak pamiętać, że domyślnie napisy złączane są według kolejności losowej (takiej, z jaką „wpadną w ręce” silnika), sterować zaś nią można przy użyciu polecenia WITHIN GROUP .
Poniżej prosty przykład z separatorem spacji (który oczywiście nie doklei się po ostatniej wartości).
Tworzymy prostą tabelę i wrzucamy do niej słowa w losowej kolejności:
CREATE TABLE #TEST
(
id TINYINT IDENTITY PRIMARY KEY,
napis NVARCHAR(50),
kolejnosc TINYINT
);
/*
Ala - 1
ma - 2
kota - 3
kot - 4
ma - 5
Alę - 6
*/
INSERT #TEST
(
napis,
kolejnosc
)
VALUES
(N'ma', 5),
(N'kot', 4),
(N'ma', 2),
(N'Alę', 6),
(N'Ala', 1),
(N'kota,', 3);
Uruchomienie SELECT * FROM #TEST; naturalnie pokaże nam kolejność zgodną z indeksem klastrowym (który jest taki sam jak klucz główny)
Złączenie napisów również po PK:
SELECT abc = STRING_AGG(napis, ' ') FROM #TEST
Natomiast użycie WITHIN zadziała zgodnie z oczekiwaniami 🙂
SELECT abc = STRING_AGG(napis,' ') WITHIN GROUP (ORDER BY kolejnosc ASC) FROM #TEST
Proste, a cieszy ;]


