Измените имя элемента с помощью 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')