Click here to Skip to main content
15,890,512 members
Please Sign up or sign in to vote.
1.60/5 (2 votes)
See more:
XML
Hi,
I have a table structure like:

[int]  [varchar]  [xml]
ID     Name       xmlData
1      ABC        <row><d1>10</d1><d2>25</d2></row>
2      XYZ        <row><d1>12</d1><d2>11</d2><d3>15</d3></row>

and want the output as :

ID Name xmlCol Value

1  ABC  D1     10
1  ABC  D2     25
2  XYZ  D1     12
2  XYZ  D2     11
2  XYZ  D3     15
Posted

1 solution

Hi,

If you're using SQL Server 2008 or above, you can do it in this way:
SQL
CREATE TABLE #TempTable
  (ID      INT,
   Name    VARCHAR(50),
   xmlData XML);

INSERT INTO #TempTable (ID, Name, xmlData)
VALUES	(1, 'ABC', '<row><d1>10</d1><d2>25</d2></row>'),
	(2, 'XYZ', '<row><d1>12</d1><d2>11</d2><d3>15</d3></row>');


;WITH Data
     AS (SELECT ID,
                Name,
                xmlCol = C.value('local-name(.)', 'VARCHAR(50)'),
                [Value] = C.value('./.', 'INT')
         FROM   #TempTable
                CROSS APPLY xmlData.nodes('/row/*') AS T(C))
SELECT ID, Name, xmlCol, [Value]
FROM Data;


DROP TABLE #TempTable;

So here I'm using CTE, CROSS APPLY and XQuery to parse XML and transform the data into desired output.

Result:
XML
ID	Name	xmlCol	Value
1	ABC	d1	10
1	ABC	d2	25
2	XYZ	d1	12
2	XYZ	d2	11
2	XYZ	d3	15
 
Share this answer
 
Comments
Member 10684823 12-Jul-14 19:50pm    
Hi Andrius,

Thanks for the solution. It works great.........
Andrius Leonavicius 12-Jul-14 21:42pm    
You're welcome. I'm glad to hear this. :)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900