SQL 服务器中的分层 XML 到 Table

Hierarchical XML to Table in SQL Server

我正在尝试将来自医疗设备的数据流转换为可用的 table。该设备通过 RS-232 端口吐出 XML 格式的文本,我使用来自 Magenta Systems 的名为 ComCap4 的软件捕获了这些文本。我已经能够将每行文本的一行转换为一个 XML 对象,但是我被 SQL 服务器中的 XML 语法所改变。

这是 XML 的示例:

<sample>
  <instrinfo>
    <p>
      <n>SNO</n>
      <v>179</v>
    </p>
  </instrinfo>
  <smpinfo>
    <p>
      <n>ID</n>
      <v>26551.0</v>
    </p>
  </smpinfo>
  <smpresults>
    <p>
      <n>WBC</n>
      <v>8.4</v>
      <l>3.5</l>
      <h>10.0</h>
    </p>
  </smpresults>
</sample>
<sample>
  <instrinfo>
    <p>
      <n>SNO</n>
      <v>179</v>
    </p>
  </instrinfo>
  <smpinfo>
    <p>
      <n>ID</n>
      <v>26552.0</v>
    </p>
  </smpinfo>
  <smpresults>
    <p>
      <n>WBC</n>
      <v>6.1</v>
      <l>3.5</l>
      <h>10.0</h>
    </p>
  </smpresults>
</sample>

我想将此 XML 转换为 table,如下所示:

InstrumentSNO  SampleID  WBCVal  WBCLow  WBCHigh
-------------  --------  ------  ------  -------
179            26551.0   8.4     3.5     10.0
179            26552.0   6.1     3.5     10.0

我几乎没有解析 XML 的经验(从这个问题中可能很明显),我在这里和其他地方找到的例子让我比以往任何时候都更加困惑。

非常感谢任何正确方向的帮助、链接或建议!

这样试试:

DECLARE @xml XML=
'<sample>
  <instrinfo>
    <p>
      <n>SNO</n>
      <v>179</v>
    </p>
  </instrinfo>
  <smpinfo>
    <p>
      <n>ID</n>
      <v>26551.0</v>
    </p>
  </smpinfo>
  <smpresults>
    <p>
      <n>WBC</n>
      <v>8.4</v>
      <l>3.5</l>
      <h>10.0</h>
    </p>
  </smpresults>
</sample>
<sample>
  <instrinfo>
    <p>
      <n>SNO</n>
      <v>179</v>
    </p>
  </instrinfo>
  <smpinfo>
    <p>
      <n>ID</n>
      <v>26552.0</v>
    </p>
  </smpinfo>
  <smpresults>
    <p>
      <n>WBC</n>
      <v>6.1</v>
      <l>3.5</l>
      <h>10.0</h>
    </p>
  </smpresults>
</sample>';

--这里是查询

SELECT s.value('(instrinfo/p/v)[1]','int') AS InstrumentSNO
      ,s.value('(smpinfo/p/v)[1]','decimal(10,1)') AS SampleID
      ,s.value('(smpresults/p/v)[1]','decimal(10,1)') AS WBCVal
      ,s.value('(smpresults/p/l)[1]','decimal(10,1)') AS WBCLow
      ,s.value('(smpresults/p/h)[1]','decimal(10,1)') AS WBCHigh
FROM @xml.nodes('/sample') AS A(s)

结果

InstrumentSNO   SampleID    WBCVal  WBCLow  WBCHigh
179             26551.0     8.4     3.5     10.0
179             26552.0     6.1     3.5     10.0

简短说明

您的 XML 显然包含 sample 元素集。 CROSS APPLY .nodes('/sample')我们可以一一解决。

虽然有嵌套元素,但它们似乎都是 1:1 命名元素,所以我们可以通过从 sample 节点向下的相对路径通过它们的名称来选择它们。