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
De vraag ontleden
De hoofdquery doet een group by
dus je krijgt maar één rij voor elke EntryID
.
De kolom TagsCommaDelimited
is gemaakt met een gecorreleerde subquery.
In SQL Server for xml path
wordt gebruikt om een XML-weergave van een queryresultaat te maken. Je hebt goede controle over hoe de XML wordt gemaakt door kolomaliassen en de parameters naar path
. te gebruiken en root
.
De aaneengeschakelde waarde ', '+T.Name
in de co-gerelateerde subquery heeft geen kolomnaam en de lege parameter voor for xml path('')
creëert de xml zonder enige tags. Er wordt slechts één tekstwaarde geretourneerd.
Wanneer u type
toevoegt
naar een for xml
query, het gegevenstype is XML
.
Om een waarde uit een XML te halen, moet u de value()
methode. Je zou naar een string kunnen casten, maar als je dat deed, zou je bijvoorbeeld &
. krijgen in de string waar je &
. hebt gebruikt .
De eerste parameter in de value()
functie is de xQuery-expressie die wordt gebruikt om de gewenste waarde te krijgen. Gebruik text()
om aan te geven dat u alleen de waarde voor het huidige element wilt. [1]
vertelt SQL Server dat u het eerste tekstknooppunt wilt vinden (u hebt er hier maar één) maar het is nog steeds noodzakelijk.
De tekenreeks gemaakt door de for xml
query heeft een extra komma en een spatie aan het begin van de tekenreeks en die moet worden verwijderd. Hier gebruik ik de XQuery-functie substring
om alles te krijgen behalve de eerste twee tekens.
De tweede parameter voor value()
specificeert het datatype dat moet worden geretourneerd.