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 ;]