Shredding XML into SQLServer2005 tables

  • Maybe this?

    SELECT m.value('(StaffDetails/NINumber)[1]','VARCHAR(10)') AS NINumber,

    b.value('FirstDayOfAbsence[1]','VARCHAR(10)') AS FirstDayOfAbsence,

    b.value('LastDayOfAbsence[1]','VARCHAR(10)') AS LastDayOfAbsence

    FROM @doc.nodes('/Message/SchoolWorkforceMembers/SchoolWorkforceMember') AS R(m)

    OUTER APPLY m.nodes('Absences/Absence') AS A(b)

    ____________________________________________________

    Deja View - The strange feeling that somewhere, sometime you've optimised this query before

    How to get the best help on a forum

    http://www.sqlservercentral.com/articles/Best+Practices/61537
  • 😀 Fantastic! Just the job. Thank you so much!!

  • Spoke too soon! Further examination gives another problem

    From this

    &ltSchoolWorkforceMember&gt

    &ltStaffDetails&gt

    &ltStaffMemberName&gt

    &ltPersonFamilyName&gtMOUSE&lt/PersonFamilyName&gt

    &ltGivenNames&gt

    &ltGivenName&gt

    &ltPersonGivenName&gtMickey&lt/PersonGivenName&gt

    &lt/GivenName&gt

    &lt/GivenNames&gt

    &lt/StaffMemberName&gt

    &ltNINumber&gtXX1111111XX&lt/NINumber&gt

    &ltGenderCurrent&gt2&lt/GenderCurrent&gt

    &ltPersonBirthDate&gt1901-01-01&lt/PersonBirthDate&gt

    &ltEthnicity&gtUNK&lt/Ethnicity&gt

    &ltDisability&gtNOBT&lt/Disability&gt

    &ltHLTAStatus&gtNo&lt/HLTAStatus&gt

    &ltAbsentOnCensusDay&gtY&lt/AbsentOnCensusDay&gt

    &lt/StaffDetails&gt

    &ltContractOrServiceGroup&gt

    &ltContractOrService&gt

    &ltContractType&gtPRM&lt/ContractType&gt

    &ltContractStart&gt2008-09-01&lt/ContractStart&gt

    &ltPost&gtUNA&lt/Post&gt

    &ltSchoolArrivalDate&gt1998-09-07&lt/SchoolArrivalDate&gt

    &ltOrigin&gtOTHEDU&lt/Origin&gt

    &ltLASchoolLevel&gtS&lt/LASchoolLevel&gt

    &ltEstab&gt9999&lt/Estab&gt

    &ltPostLevelDetails&gt

    &ltPayments&gt

    &ltScale&gtOT&lt/Scale&gt

    &ltRegionSpine&gtEW&lt/RegionSpine&gt

    &ltSalaryAmount&gt15825&lt/SalaryAmount&gt

    &ltSafeguardedSalary&gtfalse&lt/SafeguardedSalary&gt

    &lt/Payments&gt

    &ltHours&gt

    &ltHoursPerWeek&gt12.50&lt/HoursPerWeek&gt

    &ltFTEHours&gt37.00&lt/FTEHours&gt

    &ltWeeksPerYear&gt48&lt/WeeksPerYear&gt

    &lt/Hours&gt

    &lt/PostLevelDetails&gt

    &ltRoles&gt

    &ltRole&gt

    &ltRoleIdentifier&gtTASS&lt/RoleIdentifier&gt

    &lt/Role&gt

    &lt/Roles&gt

    &lt/ContractOrService&gt

    &ltContractOrService&gt

    &ltContractType&gtTMP&lt/ContractType&gt

    &ltContractStart&gt2008-09-01&lt/ContractStart&gt

    &ltPost&gtUNA&lt/Post&gt

    &ltSchoolArrivalDate&gt1998-09-07&lt/SchoolArrivalDate&gt

    &ltOrigin&gtOTHEDU&lt/Origin&gt

    &ltLASchoolLevel&gtS&lt/LASchoolLevel&gt

    &ltEstab&gt9999&lt/Estab&gt

    &ltPostLevelDetails&gt

    &ltPayments&gt

    &ltScale&gtOT&lt/Scale&gt

    &ltRegionSpine&gtEW&lt/RegionSpine&gt

    &ltSalaryAmount&gt15825&lt/SalaryAmount&gt

    &ltSafeguardedSalary&gtfalse&lt/SafeguardedSalary&gt

    &lt/Payments&gt

    &ltHours&gt

    &ltHoursPerWeek&gt3.50&lt/HoursPerWeek&gt

    &ltFTEHours&gt37.00&lt/FTEHours&gt

    &ltWeeksPerYear&gt48&lt/WeeksPerYear&gt

    &lt/Hours&gt

    &lt/PostLevelDetails&gt

    &ltRoles&gt

    &ltRole&gt

    &ltRoleIdentifier&gtTASS&lt/RoleIdentifier&gt

    &lt/Role&gt

    &lt/Roles&gt

    &lt/ContractOrService&gt

    &ltContractOrService&gt

    &ltContractType&gtFXT&lt/ContractType&gt

    &ltContractStart&gt2008-11-03&lt/ContractStart&gt

    &ltContractEnd&gt2008-12-31&lt/ContractEnd&gt

    &ltPost&gtUNA&lt/Post&gt

    &ltSchoolArrivalDate&gt1998-09-07&lt/SchoolArrivalDate&gt

    &ltDestinationCode&gtLEAPRM&lt/DestinationCode&gt

    &ltOrigin&gtOTHEDU&lt/Origin&gt

    &ltLASchoolLevel&gtS&lt/LASchoolLevel&gt

    &ltEstab&gt9999&lt/Estab&gt

    &ltPostLevelDetails&gt

    &ltHours&gt

    &ltHoursPerWeek&gt2.00&lt/HoursPerWeek&gt

    &ltFTEHours&gt37.00&lt/FTEHours&gt

    &ltWeeksPerYear&gt48&lt/WeeksPerYear&gt

    &lt/Hours&gt

    &lt/PostLevelDetails&gt

    &ltRoles&gt

    &ltRole&gt

    &ltRoleIdentifier&gtTASS&lt/RoleIdentifier&gt

    &lt/Role&gt

    &lt/Roles&gt

    &lt/ContractOrService&gt

    &lt/ContractOrServiceGroup&gt

    &lt/SchoolWorkforceMember&gt

    I need to get the NINumber, ContractStart and hours out in nice neat rows, like this

    XX111111XX 2008-09-01 12.50

    XX111111XX 2008-09-01 3.50

    XX111111XX 2008-11-03 2.00

    Any ideas? I've tried adapting the previous answer, but either get multiplied rows or the same ContractStart for all three.

    Thanks in anticipation!

  • SELECT m.value('(StaffDetails/NINumber)[1]','VARCHAR(10)') AS NINumber,

    b.value('ContractStart[1]','VARCHAR(10)') AS ContractStart,

    b.value('(PostLevelDetails/Hours/HoursPerWeek)[1]','DECIMAL(10,2)') AS Hours

    FROM @doc.nodes('/SchoolWorkforceMember') AS R(m)

    OUTER APPLY m.nodes('ContractOrServiceGroup/ContractOrService') AS A(b)

    ____________________________________________________

    Deja View - The strange feeling that somewhere, sometime you've optimised this query before

    How to get the best help on a forum

    http://www.sqlservercentral.com/articles/Best+Practices/61537
  • Thanks, exactly what I needed!

Viewing 5 posts - 1 through 6 (of 6 total)

You must be logged in to reply to this topic. Login to reply