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
节点向下的相对路径通过它们的名称来选择它们。
我正在尝试将来自医疗设备的数据流转换为可用的 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
节点向下的相对路径通过它们的名称来选择它们。