2017-11-29 5 views
1

ich eine Tabelle MyTable mit einer XML-Spalte MyXmlField wie folgt aus:Ersetzen Sie Attributnamen in SQL Server XML

<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> 

Das Type Attribut hat einen Wert, der einen beliebigen Wert zwischen denjenigen sein können:

type1, type2, type3, type4, type5, type6. 

Das Positionsattribut hat einen Wert, der eine beliebige ganze Zahl sein kann.

Was möchte ich mit einem XQuery zu tun ist, Attribut zu aktualisieren Type jedes Elements Node wie folgt zusammen:

  • der Namensänderung von Type zu Identifier

So endlich, würde ich gerne haben:

<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> 

Ich bin ein Anfänger mit XQ Sehr gut, und ich sehe nicht, wie man es richtig macht, außer alles in varchar umzuwandeln und einen Ersatz zu machen. Gerade jetzt, ich bin nur in der Lage, jeden Wert mit 6 fest codierten Anfragen wie folgt abfragen:

/Root/Node[@Type=type1)]/text())[1] 

Antwort

1

Versuchen Sie, die next approach, aber Sie müssen, um mögliche Leistungsprobleme berücksichtigen:

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