【问题标题】:Replace attribute name in SQL Server XML替换 SQL Server XML 中的属性名称
【发布时间】:2017-11-29 15:48:54
【问题描述】:

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

位置属性的值可以是任何整数。

我想用 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]

【问题讨论】:

    标签: sql sql-server xpath xquery-sql


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 2020-05-21
      • 2013-11-24
      • 2017-12-14
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多