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
Dissektion af forespørgslen
Hovedforespørgslen foretager en group by
så du får kun én række for hver EntryID
.
Kolonnen TagsCommaDelimited
er oprettet med en korreleret underforespørgsel.
I SQL Server for xml path
bruges til at oprette en XML-repræsentation af et forespørgselsresultat. Du har god kontrol over, hvordan XML'en oprettes ved at bruge kolonnealiaser og parametrene til path
og root
.
Den sammenkædede værdi ', '+T.Name
i den korrelerede underforespørgsel vil ikke have et kolonnenavn og den tomme parameter til for xml path('')
opretter xml uden nogen tags overhovedet. Der returneres kun én tekstværdi.
Når du tilføjer type
til en for xml
forespørgsel, vil datatypen være XML
.
For at få en værdi ud af en XML skal du bruge value()
metode. Du kunne caste til en streng, men hvis du gjorde det, ville du f.eks. få &
i strengen, uanset hvor du har brugt &
.
Den første parameter i value()
funktion er xQuery-udtrykket, der bruges til at få den værdi, du ønsker. Brug text()
for at angive, at du kun vil have værdien for det aktuelle element. [1]
fortæller SQL Server, at du vil have den første tekstnode fundet (du har kun en her), men det er stadig nødvendigt.
Strengen oprettet af for xml
forespørgslen har et ekstra komma og et mellemrum i begyndelsen af strengen, og det skal fjernes. Her bruger jeg XQuery-funktionen substring
for at få alt undtagen de to første tegn.
Den anden parameter til value()
angiver den datatype, der skal returneres.