使用xml.modify或TSQL中的其他方法更改元素名称

时间:2014-07-30 15:29:58

标签: sql xml tsql xml.modify

假设您有一个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?类似于在文本文件中使用的搜索和替换,但在查询期间。

2 个答案:

答案 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');