我有一个表MyTable
,其中包含xml列MyXmlField
,如下所示:
<Root>
<Node Type="type1" position="0"/>
<Node Type="type2" position="2"/>
<Node Type="type3" position="4"/>
<Node Type="type4" position="2"/>
<Node Type="type5" position="4"/>
<Node Type="type6" position="0"/>
</Root>
Type
属性的值可以是以下值之间的任何值:
type1, type2, type3, type4, type5, type6.
position属性的值可以是任何整数。
我想用XQuery做的是更新每个元素Type
的属性Node
,如下所示:
Type
更改为Identifier
最后,我想有这个:
<Root>
<Node Identifier="type1" position="0"/>
<Node Identifier="type2" position="2"/>
<Node Identifier="type3" position="4"/>
<Node Identifier="type4" position="2"/>
<Node Identifier="type5" position="4"/>
<Node Identifier="type6" position="0"/>
</Root>
我是XQuery的初学者,除了将所有内容转换为varchar
并进行替换之外,我没有看到如何正确地执行此操作。现在,我
我只能用6个硬编码请求查询每个值,如下所示:
/Root/Node[@Type=type1)]/text())[1]
答案 0 :(得分:1)
尝试next approach,但您需要考虑可能存在的性能问题:
with
MyTable as(
select cast(x as xml) MyXmlField
from(values('
<Root>
<Node Type="type1" position="0"/>
<Node Type="type2" position="2"/>
<Node Type="type3" position="4"/>
<Node Type="type4" position="2"/>
<Node Type="type5" position="4"/>
<Node Type="type6" position="0"/>
</Root>
'),('
<Root id="170">
<Node Type="type1" position="0"/>
<Node Type="type2" position="2"/>
<Node Type="type3" position="4"/>
<Node Type="type4" position="2"/>
<Node Type="type5" position="4"/>
<Node Type="type6" position="0"/>
<foo/>
<foo bar="42">170</foo>
</Root>
'))t(x)
)
select MyXmlField.query('
<Root>
{/Root/@*}
{
for $elem in /Root/*
return
if(local-name($elem) = "Node")
then
<Node>
{
for $attr in $elem/@*
return
if(local-name($attr) = "Type")
then attribute Identifier {$attr}
else $attr
}
{$elem/node()}
</Node>
else $elem
}
</Root>
')
from MyTable