2017-01-03 78 views
1

有这样我如何将多个XPath查询组合成一个

create table [Trades] (
    [Id] int not null 
    ,[TradeXML] xml not null 
    ) 

表,这里的TradeXML XML列

<Trade> 
    <Arg> 
    <Name>Id</Name> 
    <Data> 
     <DataItem DataType="8"></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行:


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的数据类型属性的值),就像这样:我在保存它

Id  
Function CapFloor 8 
Curve  EURCurve 8 
Rates  2.175  5 
Index  EURIBOR  8 

rextester玩耍。我试图自己结合他们,但没有设法得到正确的结果。 任何帮助将不胜感激!

回答

1

XML分解Arg元素上,然后从那里开始所需的信息:

select 
    Node.Arg.value('Name[1]', 'varchar(100)') Label, 
    Node.Arg.value('(Data/DataItem)[1]', 'varchar(100)') DataItem, 
    Node.Arg.value('(Data/DataItem)[1]/@DataType', 'varchar(100)') DataType 
from Trades as t 
cross apply t.TradeXML.nodes('//Arg') Node(Arg) 

rextester demo

+0

看起来那么简单,真棒,谢谢! – Eddict

相关问题