将 xml 分成更小的部分

Split xml into smaller pieces

我有一个 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,但欢迎任何其他想法。

通过 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 中自由更改拆分条件。