I assume, that your tags are key-value-pairs where Id="Color"
is the key, while Value="Blue"
is the value.
Try this out:
DECLARE @XML XML=
'<myXML>
<tag Id="Color" Value="Blue">Some text</tag>
<tag Id="Color" Value="Red">Some text2</tag>
<tag Id="Shape" Value="Rectangle"> Some text3 </tag>
<tag Id="Width" Value="100">Data-type INT</tag>
</myXML>';
--This statement will return a classical key-value-pairs-list
SELECT tag.value('@Id', 'varchar(max)') AS [Key]
,tag.value('@Value', 'varchar(max)') AS [Value]
,tag.value('text()[1]','nvarchar(max)') TheContent
FROM @XML.nodes('/myXML/tag') AS A(tag);
--And this will return each value in a dedicated column (which allows typing)
SELECT tag.value('.[@Id="Color"]/@Value', 'varchar(max)') AS Color
,tag.value('.[@Id="Shape"]/@Value', 'varchar(max)') AS Shape
,tag.value('.[@Id="Width"]/@Value', 'int') AS Width --typed as INT
,tag.value('text()[1]','nvarchar(max)') TheContent
FROM @XML.nodes('/myXML/tag') AS A(tag);