将xml拆分成更小的部分

时间:2017-09-29 10:41:29

标签: sql-server xml xquery-sql

我有一个xml变量。

DECLARE @xml xml = N'<Items Category="AAA">
  <Item Id="1">A</Item>
  <Item Id="2">B</Item>
  <Item Id="3">C</Item>
  <Item Id="4">D</Item>
  <Item Id="5">E</Item>
  <Item Id="6">F</Item>
  <Item Id="7">G</Item>
  <Item Id="8">H</Item>
  <Item Id="9">I</Item>
</Items>'

你能帮我写一个查询把它分成几块吗?

   <Items Category="AAA">
    <Item Id="1">A</Item>
    <Item Id="2">B</Item>
    <Item Id="3">C</Item>
   </Items>

   <Items Category="AAA">
      <Item Id="4">D</Item>
      <Item Id="5">E</Item>
      <Item Id="6">F</Item>
   </Items>

   <Items Category="AAA">
      <Item Id="7">G</Item>
      <Item Id="8">H</Item>
      <Item Id="9">I</Item>
   </Items>

我的意思是XQuery,但欢迎任何其他想法。

1 个答案:

答案 0 :(得分:0)

通过XQuery modify

执行此操作的方法
DECLARE @xml xml = N'<Items Category="AAA">
  <Item Id="1">A</Item>
  <Item Id="2">B</Item>
  <Item Id="3">C</Item>
  <Item Id="4">D</Item>
  <Item Id="5">E</Item>
  <Item Id="6">F</Item>
  <Item Id="7">G</Item>
  <Item Id="8">H</Item>
  <Item Id="9">I</Item>
</Items>';
DECLARE @temp TABLE (XmlData1 xml, XmlData2 xml, XmlData3 xml);
INSERT @temp VALUES (@xml, @xml, @xml);

UPDATE t
    SET XmlData1.modify('delete /Items/Item[not(position() >= 1 and position() < 4)]'),
        XmlData2.modify('delete /Items/Item[not(position() >= 4 and position() < 7)]'),
        XmlData3.modify('delete /Items/Item[not(position() >= 7 and position() < 10)]')
    FROM @temp t;

SELECT * FROM @temp;

通过FLWOR做到这一点的方法:

select @xml.query('
    <Items Category="AAA">
    {
        for $item in /Items/Item[position() >= 1 and position() < 4]
        return $item
    }
    </Items>');

您可以在XPath中自由更改拆分条件。