10

Given table T with columns:

ID UNIQUEIDENTIFIER
CreatedDate DATETIME
XmlData XML

Where XmlData is structured like:

<application>
    <details firstname="first" lastname="last">
        <statement>statement</statement>
    </details>
    <educationHistory>
        <education subject="subject1" />
        <education subject="subject2" />
    </educationHistory>
    <experienceHistory>
        <examiningExperienceHistory>
            <examiningExperience module="module1" />
            <examiningExperience module="module2" />
        </examiningExperienceHistory>
        <teachingExperienceHistory>
            <teachingExperience module="module1" />
            <teachingExperience module="module2" />
        </teachingExperienceHistory>
    </experienceHistory>
</application>

I need to return an extract like so:

ID Date       FirstName LastName Education    ExaminingExp TeachingExp
-----------------------------------------------------------------------
1  02-10-2012 First     Last     <xmlextract> <xmlextract> <xmlextract>

So far I have:

SELECT ID,
       CreatedDate [Date],
       XmlData.value('(application/details/@firstname)[1]','varchar(max)') [FirstName],
       XmlData.value('(application/details/@lastname)[1]','varchar(max)') [LastName]
FROM T

I'm struggling with thee last three columns. For each record, I need to list teaching/examining experience, and education. Can anybody help?

2 Answers 2

11

Use .query to extract xml.

eg

select 
XmlData.query('/application/educationHistory/*'),
XmlData.query('/application/experienceHistory/examiningExperienceHistory/*'),
XmlData.query('/application/experienceHistory/teachingExperienceHistory/*')
Sign up to request clarification or add additional context in comments.

5 Comments

This is great, thanks. Just to be cheeky, is there a way I can restrict what is returned in the query? e.g. instead of return the full xml under the path, return only certain attributes. So given <education subject="subject1" grade="grade" />, return only <education subject="subject1" />,
You can do xmldata.query ('data(/application/educationHistory/education/@subject)') which will get the value of the subject attribute
@podiluska Not with query(), but with value().
You can filter the nodes you want to be returned. I.e. @xmlVar.query('/application/educationHistory/education[@subject="subject1"]'), but you cannot filter the returned attributes. Every attribute in the returned nodes will be returned
@podiluska True, sorry, I misunderstood your comment. This returns the values of that attributes in all the nodes under that XQuery path.
5

Try this:

SELECT ID, Created [DATE] 
XmlData.value('(application/details/@firstname)[1]','varchar(max)') [FirstName],
XmlData.value('(application/details/@lastname)[1]','varchar(max)') [LastName],
XmlData.query('/application/educationHistory'),
XmlData.query('/application/experienceHistory/examiningExperienceHistory'),
XmlData.query('/application/experienceHistory/teachingExperienceHistory')
FROM T

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.