2012-03-29 70 views
1

請幫忙!我在數據庫中有一個xml字段。我正嘗試爲該字段中的每個元素插入一個新元素。例如:SQL XML插入多個元素

<some-element> 
<a> </a> 
<b> </b> 
</some-element> 
<some-element> 
<a> </a> 
<b> </b> 
</some-element> 

會插入元素c和去:

<some-element> 
<a> </a> 
<b> </b> 
<c> </c> 
</some-element> 
<some-element> 
<a> </a> 
<b> </b> 
<c> </c> 
</some-element> 

我知道我可以使用@ fieldname.modify( '插入@CElement成(/一些元素)[1]')但這隻會改變第一個元素!我想對所有元素重複這一點。

任何幫助將非常感謝! (我使用SQL Server 2008)

從答案感動:

謝謝您的回覆!如果我更具體,也許它會有所幫助......我正在描述xml中的一個簡單的數據表。我正在嘗試添加一個新列。我可以在列描述中添加列,但我需要將列元素添加到所有行。 (!它不會是一個簡單的任務,改變結構,我想避免這種情況)例如:

<Table> 
    <Columns> 
     <Column ID="0"> 
     <Column-Name>0NAME</Column-Name> 
     </Column> 
     <Column ID="1"> 
     <Column-Name>1NAME</Column-Name> 
     </Column> 
     <Column ID="2"> 
     <Column-Name>2NAME</Column-Name> 
     </Column> 
     <Column ID="3"> 
     <Column-Name>!!!! THIS COLUMN IS BEING ADDED !!!!!</Column-Name> 
     </Column> 
    </Columns> 
<Rows> 
     <Row ID="0"> 
      <C ID="0">0 contents here</C> 
      <C ID="1">0 contents here</C> 
      <C ID="2">0 contents here</C> 
      <!-- NEW COLUMN NEEDS TO BE CREATED HERE --> 
     </Row> 
     <Row ID="1"> 
      <C ID="0">1 contents here</C> 
      <C ID="1">1 contents here</C> 
      <C ID="2">1 contents here</C> 
      <!-- NEW COLUMN NEEDS TO BE CREATED HERE --> 
     </Row> 
    <Row ID="2"> 
      <C ID="0">2 contents here</C> 
      <C ID="1">2 contents here</C> 
      <C ID="2">2 contents here</C> 
      <!-- NEW COLUMN NEEDS TO BE CREATED HERE --> 
     </Row> 
</Rows> 
</Table> 

回答

1

您可以重新創建XML,如:

declare @x xml = '<some-element> 
<a>1</a> 
<b>2</b> 
</some-element> 
<some-element> 
<a>3</a> 
<b>4</b> 
</some-element>' 

select @x.query 
(' 
    for $e in some-element 
    return 
    <some-element> 
     { $e/a } 
     { $e/b } 
     <c/> 
    </some-element> 
') 
+0

我試過這種解決方案的幾種方法,但我無法讓它適用於我的數據!數據的完整描述顯示在下面的文章中 - 謝謝! – user1301537 2012-03-29 20:30:20

0

適應所提供的answerKirill Polishchuk轉換爲新的XML結構:

select @XML.query 
(' 
    for $c in Table/Columns 
    return 
    <Table> 
     <Columns> 
     { $c/* } 
     </Columns> 
     <Rows> 
     { 
      for $r in Table/Rows/Row 
      return 
      <Row> 
       { $r/* } 
       <C ID="3"/> 
      </Row> 
     } 
     </Rows> 
    </Table> 
')