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

cle*_*hoi 7 xml sql sql-server xquery sqlxml

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

我有一些关于排序元素问题的问题.

例如,有如下简单的代码.

<test>
    <tree abc="123"/>
    <tree abc="789"/>
    <tree-order abc="456"/>
</test>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,树和树顺序是不同的元素,我想按属性排序

<test>
    <tree abc="123"/>
    <tree-order abc="456"/>
    <tree abc="789"/>
</test>
Run Code Online (Sandbox Code Playgroud)

像这样.

谁有好主意解决这个问题?

谢谢.

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

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>
Run Code Online (Sandbox Code Playgroud)

成为 :

<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>
Run Code Online (Sandbox Code Playgroud)

谢谢.

Rom*_*kar 8

如果要重新排序现有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>')
Run Code Online (Sandbox Code Playgroud)

结果:

<test>
  <tree abc="123" />
  <tree-order abc="456" />
  <tree abc="789" />
</test>
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo

更新:

要重新排序多个节点,您可以像这样使用XQuery:

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

sql fiddle demo

更新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
            }
    }
')
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo