I have been trying to parse the following XML to extract values of STATNAME & STATDIRECT in SQL Server
set @xml= '
<ENVELOPE>
<STATNAME>ABC</STATNAME>
<STATVALUE>
<STATDIRECT>2</STATDIRECT>
<STATCANCELLED></STATCANCELLED>
</STATVALUE>
<STATNAME>XYZ</STATNAME>
<STATVALUE>
<STATDIRECT>10</STATDIRECT>
<STATCANCELLED>2</STATCANCELLED>
</STATVALUE>
<STATNAME>LMN</STATNAME>
<STATVALUE>
<STATDIRECT>20</STATDIRECT>
<STATCANCELLED>2</STATCANCELLED>
</STATVALUE>
</ENVELOPE>
Using XML nodes to extract the values
SELECT
t.v.value('(STATNAME/text())[1]','VARCHAR(100)') AS VOUCHERTYPE
, i.p.value('(STATDIRECT/text())[1]','VARCHAR(100)') AS VCOUNT
FROM @XML.nodes('/ENVELOPE') AS t(v)
CROSS APPLY @XML.nodes('/ENVELOPE/STATVALUE') AS i(p)
But this only repeats the first value of the XML instead of iterating to next row
Output
VOUCHERTYPE VCOUNT
ABC 2
ABC 2
ABC 2
Expected output
VOUCHERTYPE VCOUNT
ABC 2
XYZ 10
LMN 20