2017-05-16 304 views
1

我有一個XML列的表。如何在包含具有特定值的子節點的節點內添加另一個節點?例如,我想將foo/bar/e/f節點從barId 6699複製到barId 66989.我只找到您根據屬性值選擇節點的示例。我需要按照子節點值進行過濾。如何修改包含特定子節點值的XML節點?

<foo> 
    <bar> 
     <barId>66988</barId> 
     <name>baz 3</name> 
    </bar> 
    <bar> 
     <barId>66989</barId> 
     <name>b </name> 
     <e> 
      <g> 
       <h> 
        <l>-</l> 
        <m>k</m> 
       </h> 
       <h> 
        <l>p v</l> 
        <m>k</m> 
       </h> 
      </g> 
     </e> 
    </bar> 
    <bar> 
     <barId>6699</barId> 
     <name>n 4 c</name> 
     <e> 
      <f> 
       <h> 
        <i>k</i> 
        <j>9.3</j> 
       </h> 
      </f> 
     </e> 
    </bar> 
</foo> 
+0

下面是訪問節點與特定的子節點值的例子:http://stackoverflow.com /問題/ 20864617/T-SQL-DELETE-XML節點,如果其通子元素,包含-A-給定值?RQ = 1 – jumxozizi

回答

2

試試這個:

DECLARE @value XML = '<foo><bar><barId>66988</barId><name>baz 3</name></bar><bar><barId>66989</barId><name>b </name><e><g><h><l>-</l><m>k</m></h><h><l>p v</l><m>k</m></h></g></e></bar><bar><barId>6699</barId><name>n 4 c</name><e><f><h><i>k</i><j>9.3</j></h></f></e></bar></foo>'; 

DECLARE @SourceID INT = 6699; 
DECLARE @DestinationID INT = 66989; 

DECLARE @temp XML; 

SELECT @temp = T.c.query('.') 
FROM @value.nodes('/foo/bar[barId = sql:variable("@SourceID")]/e/f') T(c); 

SELECT @temp; 

SET @value.modify('insert sql:variable("@temp") as last into (/foo/bar[barId =sql:variable("@DestinationID")]/e)[1]') 

SELECT @value; 

它會給你:

<foo> 
    <bar> 
    <barId>66988</barId> 
    <name>baz 3</name> 
    </bar> 
    <bar> 
    <barId>66989</barId> 
    <name>b </name> 
    <e> 
     <g> 
     <h> 
      <l>-</l> 
      <m>k</m> 
     </h> 
     <h> 
      <l>p v</l> 
      <m>k</m> 
     </h> 
     </g> 
     <f> 
     <h> 
      <i>k</i> 
      <j>9.3</j> 
     </h> 
     </f> 
    </e> 
    </bar> 
    <bar> 
    <barId>6699</barId> 
    <name>n 4 c</name> 
    <e> 
     <f> 
     <h> 
      <i>k</i> 
      <j>9.3</j> 
     </h> 
     </f> 
    </e> 
    </bar> 
</foo> 
相關問題