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
Disséquer la requête
La requête principale fait un group by
vous n'obtenez donc qu'une seule ligne pour chaque EntryID
.
La colonne TagsCommaDelimited
est créé avec une sous-requête corrélée.
Dans SQL Server for xml path
est utilisé pour créer une représentation XML d'un résultat de requête. Vous avez un bon contrôle sur la façon dont le XML est créé en utilisant des alias de colonne et les paramètres de path
et root
.
La valeur concaténée ', '+T.Name
dans la sous-requête corrélée n'aura pas de nom de colonne et le paramètre vide à for xml path('')
crée le xml sans aucune balise. Il n'y aura qu'une seule valeur de texte renvoyée.
Lorsque vous ajoutez type
à un for xml
requête le type de données sera XML
.
Pour obtenir une valeur à partir d'un XML, vous devez utiliser la valeur value()
méthode. Vous pouvez convertir une chaîne, mais si vous le faites, vous obtiendrez par exemple &
dans la chaîne où vous avez utilisé &
.
Le premier paramètre dans le value()
function est l'expression xQuery utilisée pour obtenir la valeur souhaitée. Utilisez text()
pour spécifier que vous ne voulez que la valeur de l'élément actuel. [1]
indique à SQL Server que vous voulez que le premier nœud de texte soit trouvé (vous n'en avez qu'un ici) mais il est toujours nécessaire.
La chaîne créée par le for xml
query a une virgule supplémentaire et un espace au début de la chaîne et cela doit être supprimé. Ici, j'utilise la fonction XQuery substring
pour obtenir tout sauf les deux premiers caractères.
Le deuxième paramètre de value()
spécifie le type de données qui doit être renvoyé.