2012-03-29 79 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> 
')