替换SQL Server XML中的属性名称

时间:2017-11-29 15:48:54

标签: sql sql-server xpath xquery-sql

我有一个表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]

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