select ET1.EntryID,
(
select ', '+T.Name
from Tags as T
inner join EntryTag as ET2
on T.TagID = ET2.TagID
where ET1.EntryID = ET2.EntryID
for xml path(''), type
).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID
Przeanalizowanie zapytania
Główne zapytanie wykonuje group by więc otrzymujesz tylko jeden wiersz dla każdego EntryID .
Kolumna TagsCommaDelimited jest tworzony ze skorelowanym podzapytaniem.
W SQL Server for xml path
służy do tworzenia reprezentacji XML wyniku zapytania. Masz dobrą kontrolę nad sposobem tworzenia XML, używając aliasów kolumn i parametrów path i root .
Połączona wartość ', '+T.Name w skorelowanym podzapytaniu nie będzie nazwy kolumny i pustego parametru do for xml path('') tworzy xml bez żadnych tagów. Zostanie zwrócona tylko jedna wartość tekstowa.
Po dodaniu type
do for xml zapytanie, typ danych będzie następujący:XML .
Aby uzyskać wartość z XML, należy użyć value()
metoda. Możesz rzutować na ciąg, ale jeśli to zrobisz, otrzymasz na przykład & w ciągu wszędzie tam, gdzie użyłeś & .
Pierwszy parametr w value() funkcja to wyrażenie xQuery używane do uzyskania żądanej wartości. Użyj text() aby określić, że chcesz tylko wartość dla bieżącego elementu. [1] mówi SQL Serverowi, że chcesz znaleźć pierwszy węzeł tekstowy (tu masz tylko jeden), ale nadal jest to konieczne.
Ciąg utworzony przez for xml zapytanie zawiera dodatkowy przecinek i spację na początku ciągu, które należy usunąć. Tutaj używam funkcji XQuery substring
aby uzyskać wszystko oprócz pierwszych dwóch znaków.
Drugi parametr value() określa typ danych, który powinien zostać zwrócony.