SQL XQuery hierarchy help

Mark Vigrass 21 Reputation points
2021-07-05T13:40:46.33+00:00

Very new to XQuery, I have an XML file that is the definition of a form on a mobile app. I need to read the xml to pull out the parent / child relationships where certain criteria is met, and they need to be ordered as they are ordered on the form (so the order in the xml document).

The XML structure is like Form > Elements > Element, but each Element tag could in theory have another nested set of Elements, and there isn't a limit of how many levels it could be. The elements themselves have ID, Text, condition tags within them. For example the first set of Elements might contain an element which is a section of the form. Then There could be a set of questions and then potentially a sub section with more questions and so on.

What I'm ideally after is a table which lists all elements in the order they appear. So the first Element, followed by it's children, and children's children, then the next top level element, followed by it's children and childrens children.

Element ID Element Ref conditions ParentID
12 SectionA 0 NULL
1 SectionA - Q1 4 12
123 SectionB 0 NULL
124 SectionB - Q1 0 123

Transact-SQL
Transact-SQL
A Microsoft extension to the ANSI SQL language that includes procedural programming, local variables, and various support functions.
4,665 questions
{count} votes

Accepted answer
  1. Viorel 118.5K Reputation points
    2021-07-05T15:08:52.017+00:00

    Check an example:

    declare @xml xml = '
    <Form>
        <Elements>
            <Element ID="12" Text="SectionA" Condition="0">
                <Element ID="1" Text="Q1" Condition="4">
                </Element>
            </Element>
            <Element ID="123" Text="SectionB" Condition="0">
                <Element ID="124" Text="Q1" Condition="0">
                </Element>
            </Element>
        </Elements>
    </Form>
    '
    
    select 
        r.value('@ID', 'int') as [Element ID],
        concat(r.value('../@Text', 'varchar(max)') + ' - ', r.value('@Text', 'varchar(max)')) as [Element Ref],
        r.value('@Condition', 'varchar(max)') as [Condition],
        r.value('../@ID', 'int') as [Parent ID]
    from @xml.nodes('//Element') t(r)
    

    It assumes that Element Ref is a concatenation between parent and child.

    Give more details, if any.


0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.