【问题标题】:Loop Through Collection of XML Records in SQL在 SQL 中循环遍历 XML 记录的集合
【发布时间】:2023-01-12 08:13:32
【问题描述】:

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

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

我需要能够遍历回调表条目并将它们添加到名为选项.

这是我需要的数据最终看起来像选项桌子。

Id Max Value SelectedRow MaxRow Term SelectedCell MaxCell Number
1 100 10 true 112.0 72 false 73 21.7
2 100 10 true 112.0 74 true 75 21.7
3 200 15 false 113.0 76 false 77 14.5
4 200 15 false 113.0 78 false 79 22.5
5 300 20 false 114.0 80 false 81 14.6
6 300 20 false 114.0 82 false 83 15.7

(注意Id列是身份键,不需要填充)

棘手的部分是我不知道 callbackTable 集合中有多少行或多少个单元格,所以我需要循环遍历结果并根据集合中的项目数插入。

我真的可以使用一些帮助,因为我不完全确定从哪里开始。

提前致谢!

【问题讨论】:

  • 你不需要循环...... SQL Server 中有 xml 支持,它应该允许你将其作为查询提取。我不熟悉它,但我建议检查 SQL Server XML 文档。

标签: sql sql-server xml loops


【解决方案1】:

如果您可以将 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);

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2018-06-16
    相关资源
    最近更新 更多