You can do it with nested nodes() methods:
select
I.C.value('(Name)[1]', 'varchar(20)') as Name,
I.C.value('(Value)[1]', 'varchar(20)') as Value,
C.C.value('(CatName)[1]', 'varchar(20)') as Category
-- into dbo.newTable
from dbo.oldTable as T
cross apply T.InfoXML.nodes('XMLData/Category') as C(C)
cross apply C.C.nodes('Item') as I(C)
Or use parent axis (..
):
select
I.C.value('(Name)[1]', 'varchar(20)') as Name,
I.C.value('(Value)[1]', 'varchar(20)') as Value,
I.C.value('(../CatName)[1]', 'varchar(20)') as Category
-- into dbo.newTable
from dbo.oldTable as T
cross apply T.InfoXML.nodes('XMLData/Category/Item') as I(C)
update:
select
I.C.value('(Name)[1]', 'varchar(20)') as Name,
I.C.value('(Value)[1]', 'varchar(20)') as Value,
C.C.value('(CategoryName)[1]', 'varchar(20)') as Category
from dbo.oldTable as T
outer apply T.InfoXML.nodes('XMLData/LongDirectory/Category/Item') as C(C)
outer apply C.C.nodes('SubCategory/Item') as I(C)