【发布时间】:2015-05-14 14:09:58
【问题描述】:
我有一个很大的XML 值存储在变量中。我首先删除属性@Suspended 设置为1 的所有condition 元素:
SET @A.modify('delete /definitions/definition/conditions/group/condition[@Suspended=1]')
然后我想删除所有没有留下任何condition 元素的group 元素(上次删除后没有留下任何子元素)。我已经设法使用以下语句来做到这一点:
SET @A.modify('delete for $Node in /definitions/definition/conditions/group
where not ( ($Node/condition)[1] instance of element() )
return $Node
')
第一次删除非常快 - 0 秒。第二次删除执行时间约为8秒。
如果可能,我正在寻找一种更好/更快的方法来执行第二次删除。
以下是XML结构示例:
<definitions>
<definition>
<conditions>
<group name="Group 1">
<condition name="condition" type="answerisin" objType="question" objID="213219" Suspended="1">
<value name="parameter">12</value>
</condition>
<condition name="condition" type="answerisin" objType="question" objID="113219" Suspended="1">
<value name="parameter">4</value>
</condition>
</group>
</conditions>
</definition>
<definition>
<conditions>
<group name="Group 1">
<condition name="condition" type="answerisin" objType="question" objID="213219" Suspended="1">
<value name="parameter">34</value>
</condition>
</group>
<group name="Group 2">
<condition name="condition" type="answerisin" objType="question" objID="213219">
<value name="parameter">12</value>
</condition>
</group>
</conditions>
</definition>
</definitions>
【问题讨论】:
-
我不确定您为什么要使用这个相当复杂的语句。
delete /definitions/definition/conditions/group[empty(condition)]呢?不过,我不确定它是否更快:取决于 SQL Server 是否严重优化了您的查询或更改实际数据需要很多时间。 -
我想最好用reference to some reference 回答这个问题。在这种情况下,它会检查子轴步骤
condition的结果序列是否为空,即测试是否缺少condition子级。从某种意义上说,这是一种否定[condition]。
标签: xml tsql xpath sql-server-2012 xquery