Получить объединенную строку значений из XML

#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?