SQL XML插入多个元素

时间:2012-03-29 18:13:39

标签: sql-server xml sql-server-2008 xpath xquery

请帮忙!我在数据库中有一个xml字段。我正在尝试为字段中的每个元素插入一个新元素。 E.g:

<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到(/ some-element)[1]')但这只会改变第一个元素!我想对所有元素重复这一点。

非常感谢任何帮助! (我使用的是SQL Server 2008)

从回答开始:

感谢您的回复!如果我更具体,也许会有所帮助...我在xml中描述了一个简单的数据表。我想添加一个新列。我可以在列描述中添加列,但我需要将列元素添加到所有行。 (改变结构并不是一项简单的任务,我想避免这种情况!)E.g:

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

2 个答案:

答案 0 :(得分: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>
')

答案 1 :(得分:0)

使answer提供的Kirill 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>
')