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.