我在变量中存储了一个很大的XML
值。我首先删除属性condition
设置为@Suspended
的所有1
元素:
SET @A.modify('delete /definitions/definition/conditions/group/condition[@Suspended=1]')
然后我想删除所有没有group
个元素的condition
元素(在上一次删除后没有留下子元素)。我已设法使用以下语句执行此操作:
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>
答案 0 :(得分:2)
你可以改写:
set @A.modify('delete /definitions/definition/conditions/group[empty(condition)]');
但我怀疑它会更快。查询计划有些不同,但在对性能至关重要的部分中大致相同。
可能对您有用的另一个选项是将XML分解为definitions/definition
上的表变量,修改表变量中的XML,然后使用for xml path
重新创建XML。
declare @T table(X xml);
insert into @T(X)
select T.X.query('.')
from @A.nodes('/definitions/definition') as T(X);
update @T
set X.modify('delete /definition/conditions/group[empty(condition)]');
set @A = (
select T.X as '*'
from @T as T
for xml path(''), root('definitions')
);
在我的测试中,粉碎XML并在小块中进行修改比修改大型XML快10倍。但这当然取决于你的实际XML是什么样的,以及definitions/definition
上的粉碎是否足够精细。</ p>