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
Disección de la consulta
La consulta principal hace un group by
por lo que solo obtiene una fila para cada EntryID
.
La columna TagsCommaDelimited
se crea con una subconsulta correlacionada.
En SQL Server for xml path
se utiliza para crear una representación XML del resultado de una consulta. Tiene un buen control sobre cómo se crea el XML mediante el uso de alias de columna y los parámetros para path
y root
.
El valor concatenado ', '+T.Name
en la subconsulta correlacionada no tendrá un nombre de columna y el parámetro vacío para for xml path('')
crea el xml sin ninguna etiqueta en absoluto. Solo se devolverá un valor de texto.
Cuando agrega type
a un for xml
consulta el tipo de datos será XML
.
Para obtener un valor de un XML, debe usar value()
método. Podría convertir a una cadena, pero si lo hiciera, por ejemplo, obtendría &
en la cadena donde haya usado &
.
El primer parámetro en el value()
La función es la expresión xQuery utilizada para obtener el valor que desea. Utilice text()
para especificar que solo desea el valor para el elemento actual. [1]
le está diciendo a SQL Server que desea que se encuentre el primer nodo de texto (solo tiene uno aquí) pero aún es necesario.
La cadena creada por for xml
query tiene una coma adicional y un espacio al comienzo de la cadena y debe eliminarse. Aquí uso la función XQuery substring
para obtener todo excepto los dos primeros caracteres.
El segundo parámetro de value()
especifica el tipo de datos que se debe devolver.