SQL Server 在SQL中循环遍历XML记录集合

tkqqtvp1  于 2023-01-16  发布在  其他
关注(0)|答案(1)|浏览(229)

我有一个数据集,看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<process xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <return>
    <approved>
      <callbackTable>
        <tableRow max="100" value="10" selectedRow="true" maxRow="112.0">
          <tableCell term="72" selectedCell="false" maxCell="73">
            <number>21.7</number>
          </tableCell>
          <tableCell term="74" selectedCell="true" maxCell="75">
            <number>21.7</number>
          </tableCell>
        </tableRow>
        <tableRow max="200" value="15" selectedRow="false" maxRow="113.0">
          <tableCell term="76" selectedCell="false" maxCell="77">
            <number>14.5</number>
          </tableCell>
          <tableCell term="78" selectedCell="false" maxCell="79">
            <number>22.5</number>
          </tableCell>
        </tableRow>
        <tableRow max="300" value="20" selectedRow="false" maxRow="114.0">
          <tableCell term="80" selectedCell="false" maxCell="81">
            <number>14.6</number>
          </tableCell>
          <tableCell term="82" selectedCell="false" maxCell="83">
            <number>15.7</number>
          </tableCell>
        </tableRow>
      </callbackTable>
    </approved>
  </return>
</process>

我需要能够遍历callbackTable条目,并将它们添加到名为Options的表中。
下面是我需要的数据在Options表中的最终外观。
| 身份证|马克斯|价值|选定行|最大行|期限|选定单元格|最大单元格|人数|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|一百|十个|真|112.0美元|七十二|假的|七十三|二十一点七|
| 第二章|一百|十个|真|112.0美元|七十四|真|七十五|二十一点七|
| 三个|二百|十五|假的|113.0美元|七十六|假的|七十七|十四点五|
| 四个|二百|十五|假的|113.0美元|七十八|假的|七十九|二十二点五|
| 五个|三百|二十个|假的|114.0美元|八十|假的|八十一|十四、六|
| 六个|三百|二十个|假的|114.0美元|八十二|假的|八十三|十五点七|
(Note Id列是身份密钥,不需要填充)
棘手的是,我不知道callbackTable集合中有多少行或多少单元格,因此我需要循环遍历结果,并根据集合中的项数进行插入。
我真的需要一些帮助,因为我不知道从哪里开始。
先谢了!

jq6vz3qz

jq6vz3qz1#

如果可以将XML处理指令中的编码更改为utf-16或忽略它,请尝试下面基于集合的查询。请注意,目标表的Id列从列列表中忽略,以便SQL Server将分配IDENTITY值。

DECLARE @xml xml =
<process xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <return>
    <approved>
      <callbackTable>
        <tableRow max="100" value="10" selectedRow="true" maxRow="112.0">
          <tableCell term="72" selectedCell="false" maxCell="73">
            <number>21.7</number>
          </tableCell>
          <tableCell term="74" selectedCell="true" maxCell="75">
            <number>21.7</number>
          </tableCell>
        </tableRow>
        <tableRow max="200" value="15" selectedRow="false" maxRow="113.0">
          <tableCell term="76" selectedCell="false" maxCell="77">
            <number>14.5</number>
          </tableCell>
          <tableCell term="78" selectedCell="false" maxCell="79">
            <number>22.5</number>
          </tableCell>
        </tableRow>
        <tableRow max="300" value="20" selectedRow="false" maxRow="114.0">
          <tableCell term="80" selectedCell="false" maxCell="81">
            <number>14.6</number>
          </tableCell>
          <tableCell term="82" selectedCell="false" maxCell="83">
            <number>15.7</number>
          </tableCell>
        </tableRow>
      </callbackTable>
    </approved>
  </return>
</process>';

INSERT INTO dbo.TargetTable([Max],[Value],[SelectedRow],[MaxRow],[Term],[SelectedCell],[MaxCell],[Number])
SELECT
     tableRow.value('data(./@max)', 'varchar(10)')
    ,tableRow.value('data(./@value)', 'int')
    ,tableRow.value('data(./@selectedRow)', 'varchar(10)')
    ,tableRow.value('data(./@maxRow)', 'decimal(10,1)')
    ,tableCell.value('data(./@term)', 'int')
    ,tableCell.value('data(./@selectedCell)', 'varchar(10)')
    ,tableCell.value('data(./@maxCell)', 'int')
    ,tableCell.value('./number[1]', 'decimal(10,1)')
FROM @xml.nodes('//tableRow') AS tableRow(tableRow)
CROSS APPLY tableRow.nodes('//tableCell') AS tableCell(tableCell);

相关问题