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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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:
1 2 |
SELECT abc = STRING_AGG(napis, ' ') FROM #TEST |
Natomiast użycie WITHIN zadziała zgodnie z oczekiwaniami 🙂
1 2 3 4 |
SELECT abc = STRING_AGG(napis,' ') WITHIN GROUP (ORDER BY kolejnosc ASC) FROM #TEST |
Proste, a cieszy ;]