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
Analyse der Abfrage
Die Hauptabfrage führt ein group by
durch Sie erhalten also nur eine Zeile für jede EntryID
.
Die Spalte TagsCommaDelimited
wird mit einer korrelierten Unterabfrage erstellt.
In SQL Server für XML-Pfad
wird verwendet, um eine XML-Darstellung eines Abfrageergebnisses zu erstellen. Sie haben eine gute Kontrolle darüber, wie das XML erstellt wird, indem Sie Spaltenaliase und die Parameter für path
verwenden und root
.
Der verkettete Wert ', '+T.Name
in der verknüpften Unterabfrage keinen Spaltennamen und den leeren Parameter for xml path('')
haben erstellt die XML-Datei überhaupt ohne Tags. Es wird nur ein Textwert zurückgegeben.
Wenn Sie geben
zu einem für xml
Abfrage ist der Datentyp XML
.
Um einen Wert aus einem XML zu erhalten, sollten Sie den value( )
Methode. Sie könnten in einen String umwandeln, aber wenn Sie das täten, würden Sie zum Beispiel &
erhalten in der Zeichenfolge, wo immer Sie &
verwendet haben .
Der erste Parameter in value()
function ist der xQuery-Ausdruck, der zum Abrufen des gewünschten Werts verwendet wird. Verwenden Sie text()
um anzugeben, dass Sie nur den Wert für das aktuelle Element möchten. [1][code> teilt SQL Server mit, dass Sie den ersten gefundenen Textknoten haben möchten (Sie haben hier nur einen), aber es ist immer noch notwendig.
Die Zeichenfolge, die von for xml
erstellt wurde query hat ein zusätzliches Komma und ein Leerzeichen am Anfang der Zeichenfolge, die entfernt werden müssen. Hier verwende ich die XQuery-Funktion substring
um alles außer den ersten beiden Zeichen zu erhalten.
Der zweite Parameter zu value()
gibt den Datentyp an, der zurückgegeben werden soll.