TSQL XQuery 获取两个子节点

TSQL XQuery to obtain two child nodes

我正在处理 XML 数据并想要 return 两个子节点的值。我可以使用单个节点来完成这项工作,但不能使用 return 两个单独的列。如何将 xPath 和 xQuery 写入 return 两列?

DECLARE @x XML
Set @x = '
<MT_BoxTextCtrl>
  <DataSpec>ShipID_3_1_1</DataSpec>
  <Label>Mode</Label>
  <Size>230,30</Size>
  <Units />
  <UserLoValue />
</MT_BoxTextCtrl>
<MT_BoxTextCtrl>
  <DataSpec>ShipID_3_1_2</DataSpec>
  <Label>Sub Mode</Label>
  <Size>230,30</Size>
  <Units />
  <UserLoValue />
</MT_BoxTextCtrl>
<MT_AlarmCtrl>
  <AlarmRngIsReversed>False</AlarmRngIsReversed>
  <CustomQuery />
  <DataSpec>ShipID_9_1_1</DataSpec>
  <HiValue>1</HiValue>
  <Label />
</MT_AlarmCtrl>
<MT_AlarmCtrl>
  <AlarmRngIsReversed>False</AlarmRngIsReversed>
  <CustomQuery />
  <DataSpec>ShipID_9_1_5</DataSpec>
  <HiValue>1</HiValue>
  <Label>In 500M DP Zone</Label>
</MT_AlarmCtrl>'


Select T.c.value('.', 'varchar(30)') as 'DataSpec'
from @x.nodes('//DataSpec') T(c)

Select T.c.value('.', 'varchar(30)') as Label
from @x.nodes('//Label') T(c)

谢谢

试试这个:

SELECT
    NodeType = XC.value('local-name(.)', 'varchar(25)'),
    DataSpec = XC.value('(DataSpec)[1]', 'varchar(30)'),
    Label = XC.value('(Label)[1]', 'varchar(30)')
FROM 
    @x.nodes('/*') XT(XC)

这基本上需要每个顶级节点和 returns 这些 XML 片段中的 "virtual" table。从那些 XML 片段中,我获取节点名称(相关 XML 节点的 "type")、DataSpecLabel 子元素(它们的文本值)。

我得到这样的输出: