2017-01-03 2 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 и значение атрибута DataType (первого) 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

Смежные вопросы