2

假设您有一个 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 您可以更改值或属性,但不能更改元素本身。

有没有办法将第一个查询结果存储在@X1 xml 变量中,然后将元素 Category1 和 Category2 更改为 Category 并将其放入变量 @X2?类似于在文本文件中使用的搜索和替换,但在查询期间。

4

2 回答 2

2

sneaking a null in between elements can do the trick:

Select
1 as 'Category/@Level',
t.MainCat as "Category",
null,
2 as 'Category/@Level',
t.SubCat as "Category"
FOR XML PATH (''), ROOT('Taxonomy')
于 2014-07-30T17:39:47.217 回答
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');

orvalues子句在形成输出 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');
于 2014-07-30T18:17:26.060 回答