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
Разбиране на заявката
Основната заявка прави group by
така че получавате само един ред за всеки EntryID
.
Колоната TagsCommaDelimited
се създава с корелирана подзаявка.
В SQL Server for xml path
се използва за създаване на XML представяне на резултат от заявка. Имате добър контрол върху това как се създава XML чрез използване на псевдоними на колони и параметри към path
и root
.
Свързаната стойност ', '+T.Name
в свързаната подзаявка няма да има име на колона и празен параметър за for xml path('')
създава xml без никакви тагове. Ще бъде върната само една текстова стойност.
Когато добавите type
към for xml
заявка типът данни ще бъде XML
.
За да получите стойност от XML, трябва да използвате value()
метод. Можете да прехвърляте към низ, но ако го направите, ще получите например &
в низа, където и да сте използвали &
.
Първият параметър в value()
функцията е изразът xQuery, използван за получаване на желаната от вас стойност. Използвайте text()
за да посочите, че искате само стойността за текущия елемент. [1]
казва на SQL Server, че искате да бъде намерен първият текстов възел (тук имате само един), но все пак е необходимо.
Низът, създаден от for xml
заявката има допълнителна запетая и интервал в началото на низа и това трябва да бъде премахнато. Тук използвам функцията XQuery substring
за да получите всичко освен първите два знака.
Вторият параметър към value()
определя типа данни, които трябва да бъдат върнати.