【问题标题】:Hierarchical XML to Table in SQL ServerSQL Server 中的分层 XML 到表
【发布时间】:2017-01-08 16:50:02
【问题描述】:

我正在尝试将来自医疗设备的数据流转换为可用表。该设备通过 RS-232 端口输出 XML 格式的文本,我使用 Magenta Systems 的 ComCap4 软件捕获了这些文本。我已经能够将每行文本的一行转换为一个 XML 对象,但我却被 SQL Server 中的 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 转换为如下所示的表格:

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

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

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

【问题讨论】:

    标签: sql-server xml tsql xml-parsing hierarchy


    【解决方案1】:

    试试这样:

    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-node 向下的相对路径。

    【讨论】:

    • 感谢您快速、准确的回复!完美运行。
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多