小编典典

SQL Server:按属性进行FOR XML排序控制

sql

我正在从SQL Server查询生成XML文件。

我对元素排序有一些疑问。

例如,有下面的简单代码。

<test>
    <tree abc="123"/>
    <tree abc="789"/>
    <tree-order abc="456"/>
</test>

如您所见,树和树顺序是不同的元素,我想按属性排序

<test>
    <tree abc="123"/>
    <tree-order abc="456"/>
    <tree abc="789"/>
</test>

像这样。

任何人都有解决这个问题的好主意吗?

谢谢你。

对不起,我有以下详细问题

AS是

 <Main>

<test>
    <tree abc="123"/>
    <tree abc="789"/>
    <tree-order abc="456"/>
</test>

<test>
    <tree abc="123"/>
    <tree abc="789"/>
    <tree-order abc="456"/>
</test>

</Main>

成为 :

<Main>

<test>
    <tree abc="123"/>
    <tree abc="456"/>
    <tree-order abc="789/>
</test>

<test>
    <tree abc="123"/>
    <tree abc="456"/>
    <tree-order abc="789/>
</test>

</Main>

谢谢你。


阅读 218

收藏
2021-03-23

共1个答案

小编典典

如果要重新排序现有的xml,可以使用XQuery

declare @data xml = '
<test>
    <tree abc="123"/>
    <tree abc="789"/>
    <tree-order abc="456"/>
</test>
'

select @data.query('<test>{for $i in test/* order by $i/@abc return $i}</test>')

结果:

<test>
  <tree abc="123" />
  <tree-order abc="456" />
  <tree abc="789" />
</test>

[sql fiddle demo](http://sqlfiddle.com/#!3/d41d8/26941)

更新:

要对多个节点重新排序,可以使用XQuery,如下所示:

select @data.query('
    element Main {
        for $j in Main/test
            return element test {
                for $i in $j/* order by $i/@abc return $i
            }
    }
')

[sql fiddle demo](http://sqlfiddle.com/#!3/d41d8/26968)

更新2

要按属性的整数值排序,请使用cast as <type>

select @data.query('
    element Main {
        for $j in Main/test
            return element test {
                for $i in $j/* order by $i/@abc cast as xs:integer?
                    return $i
            }
    }
')

[sql fiddle demo](http://sqlfiddle.com/#!3/d41d8/26982)

2021-03-23