XML-запрос для возврата нескольких значений во вложенном пути - PullRequest
0 голосов
/ 25 марта 2019

У меня большой XML-файл, содержащий демографические данные и квалификации более 100 000 человек.

Я могу успешно запросить данные, но для людей, имеющих несколько квалификаций, я получаю только 1 квалификацию, возвращенную с использованием этого утверждения

;WITH XMLNAMESPACES('http://xxx/pie/svc/frs/FindRegistration/2.0.0' AS rt, 
                    'http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0' AS msg,
                    'http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0' AS el)
    SELECT
        --@ExtractFileName as Extract_File_Name,
        ProfessionNumber = XC.value('(../@ProfessionNumber)', 'varchar(50)'),
        QualificationEditDate = XC.value('(el:Qualification/@QualificationEditDate)[1]', 'varchar(50)'),
        QualificationTitle = XC.value('(el:Qualification/el:QualificationTitle)[1]', 'varchar(200)'),
        AwardingInstitution = XC.value('(el:Qualification/el:AwardingInstitution)[1]', 'varchar(200)'),
        CountryQualificationObtained = XC.value('(el:Qualification/el:CountryQualificationObtained)[1]', 'varchar(50)'),
        YearOfQualification = XC.value('(el:Qualification/el:YearOfQualification)[1]', 'varchar(50)')

    FROM
        AHPRA_XML as t
        CROSS APPLY
            t.XMLData.nodes('/rt:FindRegistrationsResponse/msg:ProfessionNumberReplay/msg:Practitioner') XT(XC)

Структура xml для человека с несколькими квалификациями выглядит следующим образом:

<ProfessionNumberReplay xmlns="http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0" ProfessionNumber="MED0000xxx">
   <Practitioner>
      <PractitionerIdentifier xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">6aec2xxxx8096b</PractitionerIdentifier>
      <PractitionerName xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0" NameEditDate="2010-07-03T14:14:35.377">
         <NameTitle>Dr</NameTitle>
         <FamilyName>xxxx</FamilyName>
         <GivenName>xxxx</GivenName>
         <MiddleName />
      </PractitionerName>
      <Demographics xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
         <Gender>M</Gender>
      </Demographics>
      <Qualification xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0" QualificationEditDate="2016-07-27T18:36:35.46">
         <QualificationTitle>Name of Qualification 1</QualificationTitle>
         <AwardingInstitution>Name of University</AwardingInstitution>
         <CountryQualificationObtained>United Kingdom</CountryQualificationObtained>
         <YearOfQualification>1966</YearOfQualification>
      </Qualification>
      <Qualification xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0" QualificationEditDate="2016-07-25T17:49:36.23">
         <QualificationTitle>Name of Qualification 2</QualificationTitle>
         <AwardingInstitution>Name of University</AwardingInstitution>
         <CountryQualificationObtained>Sri Lanka</CountryQualificationObtained>
         <YearOfQualification>1960</YearOfQualification>
      </Qualification>
      <Qualification xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0" QualificationEditDate="2016-08-10T19:37:23.517">
         <QualificationTitle>Name of Qualification 3</QualificationTitle>
         <AwardingInstitution>Name of University</AwardingInstitution>
         <CountryQualificationObtained>Sri Lanka</CountryQualificationObtained>
         <YearOfQualification>1959</YearOfQualification>
      </Qualification>
      <Qualification xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0" QualificationEditDate="2016-07-26T18:33:08.79">
         <QualificationTitle>Name of Qualification 4</QualificationTitle>
         <AwardingInstitution>Name of University</AwardingInstitution>
         <CountryQualificationObtained>United Kingdom</CountryQualificationObtained>
         <YearOfQualification>1959</YearOfQualification>
      </Qualification>
      <Address xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0" AddressEditDate="2017-01-10T16:55:49.34">
         <AustralianAddress>
            <AustralianLocality>Suburb Name</AustralianLocality>
            <AustralianPostcode>1000</AustralianPostcode>
            <AustralianState>QLD</AustralianState>
            <Country>Australia</Country>
         </AustralianAddress>
      </Address>
      <Profession xmlns="http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0">
         <ProfessionNumber>MED0000xxx</ProfessionNumber>
         <Profession>Medical Practitioner</Profession>
         <ProfessionStartDate>1972-12-06T00:00:00</ProfessionStartDate>
         <Registration>
            <RecordNumber>001</RecordNumber>
            <RegistrationType>General</RegistrationType>
            <RegistrationStatus>Unregistered</RegistrationStatus>
            <RegistrationSubStatus>Not Renewed</RegistrationSubStatus>
            <RegistrationToDate>2017-09-30T00:00:00</RegistrationToDate>
            <InitialRegistrationDate>1972-12-06T00:00:00</InitialRegistrationDate>
         </Registration>
      </Profession>
   </Practitioner>
</ProfessionNumberReplay>

Я попытался добавить "." но так как я возвращаю данные из других путей во вложенном XML, я не могу заставить это работать.

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Спасибо @RogerWolf за ваш пример заявления.Когда я запустил его, он не дал никаких данных, но ваши комментарии высветили тот факт, что я не зашел достаточно далеко вниз по иерархии.Чтобы это исправить, я просто изменил CROSS APPLY (последняя строка), чтобы перейти на уровень «Квалификация», а затем поднялся на дополнительный уровень в каждом из столбцов, которые я хотел вернуть - см. Код ниже:

;WITH XMLNAMESPACES('http://xxx/pie/svc/frs/FindRegistration/2.0.0' AS rt, 
                    'http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0' AS msg,
                    'http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0' AS el)
    SELECT
        ProfessionNumber = XC.value('(../../@ProfessionNumber)', 'varchar(50)'),
        QualificationEditDate = XC.value('(@QualificationEditDate)[1]', 'varchar(50)'),
        QualificationTitle = XC.value('(el:QualificationTitle)[1]', 'varchar(200)'),
        AwardingInstitution = XC.value('(el:AwardingInstitution)[1]', 'varchar(200)'),
        CountryQualificationObtained = XC.value('(el:CountryQualificationObtained)[1]', 'varchar(50)'),
        YearOfQualification = XC.value('(el:YearOfQualification)[1]', 'varchar(50)')
    FROM
        AHPRA_XML as t
              CROSS APPLY
                     t.XMLData.nodes('/rt:FindRegistrationsResponse/msg:ProfessionNumberReplay/msg:Practitioner/el:Qualification') XT(XC)

Я не уверен, что это более / менее эффективно, чем код, который вы предоставили, но для меня это имеет смысл.

Еще раз спасибо

0 голосов
/ 25 марта 2019

После вставки вашего фрагмента в таблицу:

declare @t table (XMLData xml not null);

, следующий код делает то, что вы хотите:

with xmlnamespaces(
  'http://xxx/pie/xsd/frs/FindRegistrationMessages/2.0.0' AS msg,
  'http://xxx/pie/xsd/frs/PractitionerRegistrationElements/2.0.0' AS el
)
SELECT
  ProfessionNumber = pnr.c.value('./@ProfessionNumber', 'varchar(50)'),
  QualificationEditDate = XC.value('./@QualificationEditDate', 'datetime2(0)'),
  QualificationTitle = XC.value('(./el:QualificationTitle/text())[1]', 'varchar(200)'),
  AwardingInstitution = XC.value('(./el:AwardingInstitution/text())[1]', 'varchar(200)'),
  CountryQualificationObtained = XC.value('(./el:CountryQualificationObtained/text())[1]', 'varchar(50)'),
  YearOfQualification = XC.value('(./el:YearOfQualification/text())[1]', 'varchar(50)')
FROM @t t
  cross apply t.XMLData.nodes('/msg:ProfessionNumberReplay') pnr(c)
  CROSS APPLY pnr.c.nodes('./msg:Practitioner/el:Qualification') XT(XC);

Проблема заключалась в том, что вы не пошли в /el:Qualification уровень иерархии в XML-методе nodes() только для его родителя.Поскольку здесь есть только один узел /msg:Practitioner, результирующий набор содержал только одну строку.Как только я переместил apply до необходимого уровня, появились все строки, а не только первый.

...