xQuery交换属性值

时间:2017-12-14 15:22:49

标签: sql sql-server xquery sql-server-2014

我正在尝试编写一个查询,它将xml形成一个数据库,并在找到某个字符时翻转两个属性值。例如:

<people>
   <person name="Alice" age="20" team="developer" dep="red" version="old" />
   <person name="Sam" age="23" team="marketing" dep="blue" version="old" />
   <person name="Bob" age="21" team="sales" dep="green" version="new" />
</people>

如果version="old",那么我想翻转团队和颜色属性。所以爱丽丝会:

<person name="Alice" age="20" team="red" dep="developer" version="new" />

我让数据库返回只有“old”的行,但我不知道如何替换属性。

UPDATE mDB
        SET people.modify('
            for $p in (/people/person)
                let $team := $p/@team
                let $dep := $p/@dep

                replace value of node
                    $p/@dep
                with 
                    $team
                replace value of node
                    $p/@team
                with 
                    $dep
        ')
        FROM mDB
        WHERE   people.exist('
                    for $p in (/people/person)
                        where contains( data( $p/@version ), "old" )
                    return data( $person/@version)') != 0

1 个答案:

答案 0 :(得分:0)

我不知道你的SQL / XQuery混合是使用XQuery的本机更新功能还是来自你的sql供应商,但是快速查看文档应该告诉你。

您目前告诉XQuery更新节点的值,您希望更新属性的值,即如果将$p/@dep替换为$p/@team,结果将只是{ {1}}和@dep在输出中切换顺序。 @team将成为<person team='x' dep='1'/>您需要按原样保留节点,但只能替换属性的值。像这样:

<person dep='1' team='x'/>

将产生所需的输出:

for $p in people/person[@version = "old"]
return
    element person { 
        attribute name {data($p/@name)}, 
        attribute age {data($p/@age)}, 
        attribute team {data($p/@dep)}, (: <- note the switch :)
        attribute dep {data($p/@team)}, (: <- s.a. :)
        attribute version {data($p/@version)}
    }