【发布时间】:2017-01-03 12:52:54
【问题描述】:
我有一张这样的桌子
create table [Trades] (
[Id] int not null
,[TradeXML] xml not null
)
这是 TradeXML xml 列的内容
<Trade>
<Arg>
<Name>Id</Name>
<Data>
<DataItem DataType="8">012345678</DataItem>
</Data>
</Arg>
<Arg>
<Name>Function</Name>
<Data>
<DataItem DataType="8">CapFloor</DataItem>
</Data>
</Arg>
<Arg>
<Name>Curve</Name>
<Data>
<DataItem DataType="8">EURCurve</DataItem>
</Data>
</Arg>
<Arg>
<Name>Rates</Name>
<Data>
<DataItem DataType="5">2.175</DataItem>
<DataItem DataType="5">2.169</DataItem>
<DataItem DataType="5">2.714</DataItem>
<DataItem DataType="5">3.394</DataItem>
<DataItem DataType="5">3.931</DataItem>
<DataItem DataType="5">4.477</DataItem>
<DataItem DataType="5">4.296</DataItem>
</Data>
</Arg>
<Arg>
<Name>Index</Name>
<Data>
<DataItem DataType="8">EURIBOR</DataItem>
</Data>
</Arg>
</Trade>
这个sql
select Node.Name.value('.', 'varchar(100)') Label
from Trades as t
cross apply t.TradeXML.nodes('//Arg/Name') Node(Name)
返回 5 行:
Id
Function
Curve
Rates
Index
这个sql
select Data.Name.value('.','varchar(100)') Value
from Trades as t
cross apply t.TradeXML.nodes('//Arg/Data/DataItem[1]') Data(Name)
返回 5 行:
012345678
CapFloor
EURCurve
2.175
EURIBOR
还有这个
select Attribute.Name.query('local-name(.)') Attribute
,Attribute.Name.value('.', 'varchar(100)') Value
from Trades as t
cross apply t.TradeXML.nodes('//@*') Attribute(Name)
返回 11 行:
DataType 8
DataType 8
DataType 8
DataType 5
DataType 5
DataType 5
DataType 5
DataType 5
DataType 5
DataType 5
DataType 8
但我想要的是这个(所以基本上是名称、(第一个)DataItem 值和(第一个)DataItem 的 DataType 属性的值)的组合,如下所示:
Id 012345678 8
Function CapFloor 8
Curve EURCurve 8
Rates 2.175 5
Index EURIBOR 8
我已将其保存在 rextester 中以供使用。我自己尝试将它们结合起来,但没有设法得到正确的结果。 任何帮助将不胜感激!
【问题讨论】:
标签: sql-server xml xpath