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)
谢谢.
如果要重新排序现有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)
更新:
要重新排序多个节点,您可以像这样使用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)
更新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)