Измените имя элемента с помощью xml.modify или другого метода в TSQL

Предположим, у вас есть запрос TSQL:

1 as 'Category1/@Level',
2 as 'Category2/@Level',
t.MainCat as 'Category1', 
t.SubCat as 'Category2'
FOR XML PATH (''), ROOT('Taxonomy')

который генерирует следующий результат:

<Taxonomy>
      <Category1 Level="1">Clothing</Category1>
      <Category2 Level="2">Jeans</Category2>
</Taxonomy>

Элементы Category1 и Category2 имеют уникальные имена для запроса SQL для генерации и преобразования в формат XML. Вот почему я использовал Category1 и Category2. Я хотел бы, чтобы конечный результат был таким:

<Taxonomy>
      <Category Level="1">Clothing</Category>
      <Category Level="2">Jeans</Category>
</Taxonomy>

Это можно сделать с помощью XML EXPLICIT, как здесь, но, поскольку мой код намного больше, он становится очень загроможденным и довольно быстрым.

С xml.modify вы можете изменять значения или атрибуты, но не сам элемент.

Есть ли способ сохранить первый результат запроса в xml-переменной @X1, а затем изменить элемент Category1 & Category2 на Category и поместить его в переменную @X2? Что-то вроде поиска и замены используется в текстовых файлах, но потом во время запроса.

2 ответа

Решение

Также вы можете использовать вложение:

select
    (select 1 as '@Level', 'Clothing'
        for xml path('Category'), type),
    (select 2 as '@Level', 'Jeans'
        for xml path('Category'), type)
for xml path('Taxonomy');

или же values предложение для построения списка категорий перед формированием выходного xml:

select Cat.Level as '@Level', Cat.Value as 'text()'
from (values
        (1, 'Clothing')
        ,(2, 'Jeans')
    ) Cat(Level, Value)
for xml path('Category'), root('Taxonomy');

Пробить ноль между элементами может сделать свое дело:

Select
1 as 'Category/@Level',
t.MainCat as "Category",
null,
2 as 'Category/@Level',
t.SubCat as "Category"
FOR XML PATH (''), ROOT('Taxonomy')
Другие вопросы по тегам