假设您有一个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具有用于生成和转换为xml格式的sql查询的唯一名称。这就是我使用Category1和Category2的原因。我希望最终结果是这样的:
<Taxonomy>
<Category Level="1">Clothing</Category>
<Category Level="2">Jeans</Category>
</Taxonomy>
这可以使用XML EXPLICIT like here来完成,但由于我的代码要大得多,所以它变得非常混乱和复杂得很快。
使用xml.modify,您可以更改值或属性,但不能更改元素本身。
有没有办法将第一个查询结果存储在@ X1 xml变量中,然后更改元素Category1&amp; Category2进入Category并将其放入变量@ X2?类似于在文本文件中使用的搜索和替换,但在查询期间。
答案 0 :(得分:2)
在元素之间偷偷摸摸可以解决这个问题:
Select
1 as 'Category/@Level',
t.MainCat as "Category",
null,
2 as 'Category/@Level',
t.SubCat as "Category"
FOR XML PATH (''), ROOT('Taxonomy')
答案 1 :(得分:1)
您也可以使用嵌套:
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');