I want to take value in each <val>
tag whose parent node is an <interv>
tag. If you see this below sample. I have two values in <val>
tag 48 and 1500.
My query is returning 481500. I am showing a sample xml and query which I tried below. In some other xml, I might have more than 10 values - can anyonly help me?
Sample XML:
declare @xml xml =
'<maintask chg="U" identask="25/63/00/000/000/056" nrd="-" revdate="2013.12.05" version="B2,B3">
<title chg="N">Electric hoist 136 kg</title>
<mainlimi category="1">
<limit msmgeographic="" type="TBO" />
<nextperf>
<interv>
<msmlimitorder>1</msmlimitorder>
<msmtemporarylimit>False</msmtemporarylimit>
<val>48</val>
<unit>M</unit>
<margin>
<val>146</val>
<unit>D</unit>
</margin>
<marginmin>
<val>0</val>
<unit>D</unit>
</marginmin>
<marginmax>
<val>0</val>
<unit>D</unit>
</marginmax>
</interv>
<interv>
<msmlimitorder>2</msmlimitorder>
<msmlimitoperator>//</msmlimitoperator>
<msmtemporarylimit>False</msmtemporarylimit>
<val>1500</val>
<unit>HC</unit>
<margin>
<val>150</val>
<unit>HC</unit>
</margin>
<marginmin>
<val>0</val>
<unit>HC</unit>
</marginmin>
<marginmax>
<val>0</val>
<unit>HC</unit>
</marginmax>
</interv>
</nextperf>
<pnrlist>
<pnrdata>
<pnr wp6sourceid="4">76370-110</pnr>
<validity />
<pn>704A41815032</pn>
</pnrdata>
<pnrdata>
<pnr wp6sourceid="5">76370-111</pnr>
<validity />
<pn>704A41815033</pn>
</pnrdata>
<pnrdata>
<pnr>xna</pnr>
<validity />
<pn>704A41815035</pn>
</pnrdata>
<pnrdata>
<pnr wp6sourceid="7">76370-130-D</pnr>
<validity />
<pn>-</pn>
</pnrdata>
<pnrdata>
<pnr wp6sourceid="8">76370-140-D</pnr>
<validity />
<pn>704A41815085</pn>
</pnrdata>
</pnrlist>
</mainlimi>
<desc>
<para chg="N">LUCAS AIR EQUIPEMENT/TRW/GOODRICH.</para>
</desc>
<nrd code="-">
<para chg="N" />
</nrd>
<climaticconditionlist>
<climaticcondition code="-">
<para chg="N" />
</climaticcondition>
</climaticconditionlist>
</maintask>'
My query :
SELECT
ISNULL(TM.value('@identask', 'VARCHAR(100)'), '') AS MI,
TM.query('title').value('.', 'NVARCHAR(100)') AS Title,
TM.query('desc/para').value('.', 'NVARCHAR(100)') AS Remarks,
TM.query('mainlimi/nextperf/interv/val').value('.', 'NVARCHAR(100)') AS val,
TM.query('mainlimi/nextperf/interv/unit').value('.','NVARCHAR(100)') AS unit
FROM
@xml.nodes('/maintask') AS TM(TM)
Result:
MI Title Remarks val unit
25/63/00/000/000/056 Electric hoist 136 kg LUCAS AIR EQUIPEMENT/TRW/GOODRICH. 481500 MHC
Expected result:
MI Title Remarks val unit
25/63/00/000/000/056 Electric hoist 136 kg LUCAS AIR EQUIPEMENT/TRW/GOODRICH. 48 M
25/63/00/000/000/056 Electric hoist 136 kg LUCAS AIR EQUIPEMENT/TRW/GOODRICH. 1500 HC
You have almost done it. Just use CROSS APPLY
to get down to the items you need to query for the values:
SELECT ISNULL(P.c.value('@identask','VARCHAR(100)') ,'')AS MI
,P.c.query('title').value('.','NVARCHAR(100)') AS Title
,P.c.query('desc/para').value('.','NVARCHAR(100)') AS Remarks
,T.c.value('(./val)[1]', 'NVARCHAR(100)') AS val
,T.c.value('(./unit)[1]', 'NVARCHAR(100)') AS unit
FROM @xml.nodes('/maintask') P(c)
CROSS APPLY P.c.nodes('./mainlimi/nextperf/interv') T(c);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.