Reputation: 1
How to convert this XML to a table in sql server 2008
Input:
<Object>
<Property Name="Prop1">1_1</Property>
<Property Name="Prop2">1_2</Property>
<Property Name="Prop3">1_3</Property>
</Object>
<Object>
<Property Name="Prop1">2_1</Property>
<Property Name="Prop2">2_2</Property>
<Property Name="Prop3">2_3</Property>
</Object>
Output:
Prop1 Prop2 Prop3
1_1 1_2 1_3
2_1 2_2 1_3
Upvotes: 0
Views: 96
Reputation: 33381
Here is the solution
DECLARE @xml XML = '<Object>
<Property Name="Prop1">1_1</Property>
<Property Name="Prop2">1_2</Property>
<Property Name="Prop3">1_3</Property>
</Object>
<Object>
<Property Name="Prop1">2_1</Property>
<Property Name="Prop2">2_2</Property>
<Property Name="Prop3">2_3</Property>
</Object>
<Object>
<Property Name="Prop1">3_1</Property>
<Property Name="Prop2">3_2</Property>
<Property Name="Prop3">3_3</Property>
</Object>'
;WITH CTE
AS
(
SELECT
rn, p.value('(@Name)[1]', 'varchar(50)') Prop, p.value('.', 'varchar(50)') PropVal
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY (SELECT 1)) rn, o.query('.') obj
FROM (VALUES (@xml)) A(x)
CROSS APPLY x.nodes('Object') P(o)
) O
CROSS APPLY O.obj.nodes('Object/Property') B(p)
)
SELECT Prop1, Prop2, Prop3
FROM CTE
PIVOT
(
MIN(PropVal)
FOR Prop IN (Prop1, Prop2, Prop3)
) piv
with desired output
Prop1 Prop2 Prop3
1_1 1_2 1_3
2_1 2_2 2_3
3_1 3_2 3_3
Upvotes: 1