2017-01-03 66 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