#sql-server #xml
#sql-сервер #xml
Вопрос:
У меня есть XML-данные, из которых я хотел бы, чтобы только значения были объединены вместе для каждого ключевого значения. Приведенный ниже код подходит близко, но не работает, пожалуйста, сообщите. То, что я попробовал ниже, — это сначала «разделить» значения из XML, а затем повторно объединить их вместе, я надеюсь, что есть лучший способ, иначе просто исправление моего кода будет оценено.
Просто примечание: я изо всех сил пытаюсь понять, как XML реализован в SQL, поэтому ответ может быть очевидным
SELECT RoleId,
/*This part does not work*/
STUFF((SELECT ', ' Condition
FROM filters /*Invalid object name 'filters'.*/
FOR XML PATH ('')), 1,1, '') vals
/*This part does not work*/
FROM (
/*This part works*/
SELECT tbl.RoleId,
p.value('@Condition', 'VARCHAR(8000)') AS Condition
FROM (
SELECT RoleId,
r.RoleName,
CAST(Data AS XML) Data
FROM dbo.RoleFilters rf
INNER JOIN dbo.Roles r
ON r.Id = rf.RoleId
) tbl
CROSS APPLY Data.nodes('/RoleFilters/Filters/ExpressionInfoGroup/Filters/Expression') t(p)
) filters
Ответ №1:
Вы не можете использовать sub-select
псевдоним для ссылки на данные. Вам нужно повторно sub-select
использовать снова, но это может быть достигнуто с помощью CTE
. CTE
может быть передано N раз
;with filters as
(
SELECT tbl.RoleId,
p.value('@Condition', 'VARCHAR(8000)') AS Condition
FROM (
SELECT RoleId,
r.RoleName,
CAST(Data AS XML) Data
FROM dbo.RoleFilters rf
INNER JOIN dbo.Roles r
ON r.Id = rf.RoleId
) tbl
CROSS APPLY Data.nodes('/RoleFilters/Filters/ExpressionInfoGroup/Filters/Expression') t(p)
)
SELECT Distinct RoleId,
STUFF((SELECT ', ' Condition
FROM filters
FOR XML PATH ('')), 1,1, '') vals
FROM filters
Комментарии:
1. Как я уже сказал, ответ может быть очевидным 🙂 Спасибо. Для этого нет «собственной» функциональности XML?