Home Forums Programming XML Shred XML with 4 level hierarchy into SQL Server table RE: Shred XML with 4 level hierarchy into SQL Server table

  • Hi, I've just come up with this... does this help with what you need:

    declare @xml xml = '<root>

    <elem10 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00">

    <elem101010 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00">

    <elem10101010 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    <elem10101020 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    </elem101010>

    <elem101020 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00">

    <elem10102010 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    <elem10102020 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    <elem10102030 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    <elem10102040 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    <elem10102050 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    </elem101020>

    </elem10>

    <elem15 Attr01="0.08" Attr02="-0.05" Attr03="9.00" Attr04="9.00" Attr05="7.00" Attr06="4.00">

    <elem151010 Attr01="0.03" Attr02="-0.01" Attr03="9.00" Attr04="9.00" Attr05="2.00" Attr06="1.00">

    <elem15101010 Attr01="0.02" Attr02="-0.01" Attr03="9.00" Attr04="9.00" Attr05="1.00" Attr06="1.00" />

    <elem15101020 Attr01="0.01" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="1.00" Attr06="0.00" />

    <elem15101030 Attr01="0.00" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="0.00" Attr06="0.00" />

    <elem15101040 Attr01="0.00" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="0.00" Attr06="0.00" />

    <elem15101050 Attr01="0.00" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="0.00" Attr06="0.00" />

    </elem151010>

    <elem151020 Attr01="0.00" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="0.00" Attr06="0.00">

    <elem15102010 Attr01="0.00" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="0.00" Attr06="0.00" />

    </elem151020>

    <elem151030 Attr01="0.02" Attr02="-0.02" Attr03="9.00" Attr04="9.00" Attr05="3.00" Attr06="1.00">

    <elem15103010 Attr01="0.01" Attr02="-0.02" Attr03="9.00" Attr04="9.00" Attr05="1.00" Attr06="1.00" />

    <elem15103020 Attr01="0.01" Attr02="0.00" Attr03="9.00" Attr04="9.00" Attr05="2.00" Attr06="0.00" />

    </elem151030>

    </elem15>

    <elem20 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00">

    <elem201010 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00">

    <elem20101010 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    </elem201010>

    <elem201020 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00">

    <elem20102010 Attr01="9.00" Attr02="9.00" Attr03="9.00" Attr04="9.00" Attr05="9.00" Attr06="9.00" />

    </elem201020>

    </elem20>

    </root>'

    select l1.c.query('local-name(.)') as ElementLVL1

    , null as ElementLVL2

    , null as ElementLVL3

    , l1.c.value('@Attr01', 'decimal(12,2)') as Attr01

    , l1.c.value('@Attr02', 'decimal(12,2)') as Attr02

    , l1.c.value('@Attr03', 'decimal(12,2)') as Attr03

    , l1.c.value('@Attr04', 'decimal(12,2)') as Attr04

    , l1.c.value('@Attr05', 'decimal(12,2)') as Attr05

    , l1.c.value('@Attr06', 'decimal(12,2)') as Attr06

    from @xml.nodes('/root/*') l1(c)

    union all

    select l1.c.query('local-name(.)')

    , l2.c.query('local-name(.)')

    , null

    , l2.c.value('@Attr01', 'decimal(12,2)')

    , l2.c.value('@Attr02', 'decimal(12,2)')

    , l2.c.value('@Attr03', 'decimal(12,2)')

    , l2.c.value('@Attr04', 'decimal(12,2)')

    , l2.c.value('@Attr05', 'decimal(12,2)')

    , l2.c.value('@Attr06', 'decimal(12,2)')

    from @xml.nodes('/root/*') l1(c)

    outer apply l1.c.nodes('*') l2(c)

    union all

    select l1.c.query('local-name(.)')

    , l2.c.query('local-name(.)')

    , l3.c.query('local-name(.)')

    , l3.c.value('@Attr01', 'decimal(12,2)')

    , l3.c.value('@Attr02', 'decimal(12,2)')

    , l3.c.value('@Attr03', 'decimal(12,2)')

    , l3.c.value('@Attr04', 'decimal(12,2)')

    , l3.c.value('@Attr05', 'decimal(12,2)')

    , l3.c.value('@Attr06', 'decimal(12,2)')

    from @xml.nodes('/root/*') l1(c)

    outer apply l1.c.nodes('*') l2(c)

    outer apply l2.c.nodes('*') l3(c)