Вы можете почти сделать это. Единственная проблема, которую я не решил, это разделитель запятыми. Вот запрос на похожую структуру, которая разделяет теги пробелом.
SELECT em.Code,
(SELECT et.Name + ' ' AS 'data()'
FROM tblEmployeeTag et
JOIN tblEmployeeTagAssignment eta ON et.Id = eta.EmployeeTag_Id AND eta.Employee_Id = em.id
FOR XML PATH('') ) AS Tags
FROM tblEmployee em
Edit:
Вот полная версия с использованием таблиц и запятой:
SELECT bk.Id AS BookId,
bk.Name AS BookName,
REPLACE((SELECT LTRIM(STR(bt.TagId)) + ', ' AS 'data()'
FROM BookTag bt
WHERE bt.BookId = bk.Id
FOR XML PATH('') ) + 'x', ', x','') AS Tags
FROM Book bk
Полагаю, для дальнейшего использования я должен немного рассказать о том, что происходит. Имя столбца data () - это специальное значение, связанное с оператором FOR XML PATH. Это приводит к тому, что документ XML будет отображаться так, как если бы вы сделали .InnerText в корневом узле результирующего XML.
Оператор REPLACE - это хитрость для удаления запятой. Добавляя уникальный символ (я случайно выбрал 'x') в конец списка тегов, я могу искать символ запятой-пробела и заменять его пустой строкой. Это позволяет мне отрубить только последнюю запятую. Это предполагает, что в ваших тегах никогда не будет этой последовательности символов.