Search code examples
sqlsql-servert-sqlsqlxml

How to get child element and attribute value with condition from xml data in sql server?


How to get child value and its attribute value with condition in sql server.? How to get this

<CheckoutAttribute ID="9">
<CheckoutAttributeValue><Value>26</Value></CheckoutAttributeValue> 
CheckoutAttributeID CheckoutAttributeValue
        9                    26

from following xml data.

<Attributes>
<CheckoutAttribute ID="4">
<CheckoutAttributeValue><Value>18</Value></CheckoutAttributeValue>
</CheckoutAttribute>
<CheckoutAttribute ID="6">
<CheckoutAttributeValue><Value>22</Value></CheckoutAttributeValue>
<CheckoutAttributeValue><Value>23</Value></CheckoutAttributeValue>
</CheckoutAttribute>
<CheckoutAttribute ID="9">
<CheckoutAttributeValue><Value>26</Value></CheckoutAttributeValue>
<CheckoutAttributeValue><Value>27</Value></CheckoutAttributeValue>
</CheckoutAttribute>
<CheckoutAttribute ID="1">
<CheckoutAttributeValue><Value>1</Value></CheckoutAttributeValue>
</CheckoutAttribute>
</Attributes>

Solution

  • CREATE TABLE #tempTable ( id INT IDENTITY(1,1), xmlDataTest xml)
    INSERT INTO #TempTable ( xmlDataTest)
    VALUES ('<Attributes>
    <CheckoutAttribute ID="4">
    <CheckoutAttributeValue><Value>18</Value></CheckoutAttributeValue>
    </CheckoutAttribute>
    <CheckoutAttribute ID="6">
    <CheckoutAttributeValue><Value>22</Value></CheckoutAttributeValue>
    <CheckoutAttributeValue><Value>23</Value></CheckoutAttributeValue>
    </CheckoutAttribute>
    <CheckoutAttribute ID="9">
    <CheckoutAttributeValue><Value>26</Value></CheckoutAttributeValue>
    <CheckoutAttributeValue><Value>27</Value></CheckoutAttributeValue>
    </CheckoutAttribute>
    <CheckoutAttribute ID="1">
    <CheckoutAttributeValue><Value>1</Value></CheckoutAttributeValue>
    </CheckoutAttribute>
    </Attributes>')
    
    SELECT r.value('@ID','int') AS CheckoutAttributeID
            , r.query('data(CheckoutAttributeValue/Value)[1]') AS CheckoutAttributeValue
    FROM #tempTable
    CROSS APPLY xmlDataTest.nodes('/Attributes/CheckoutAttribute') AS x(r)
    WHERE
    r.value('@ID','int') = 9 
    
    DROP TABLE #tempTable