SQL Server 2008 R2 SP2 функция для извлечения данных XML

#sql #xml #xpath #sql-server-2008-r2

#sql #xml #xpath #sql-server-2008-r2

Вопрос:

В настоящее время у меня есть функция, которая извлекает номер пациента из CCD , однако, CCD содержит MRN, EMPI, SSN и номер пациента. Мне нужно, чтобы он извлекал номер пациента вместо EMPI. Затем я буду использовать это для создания столбца, используя RETURN .

Пожалуйста, ПОМОГИТЕ!

Вот текущий код:

 CREATE FUNCTION [dbo].[rs_ExtractPatientIdentifier] 
    (@xmlData xml, @messageType nvarchar(50))
RETURNS 
    nvarchar(128)
WITH SCHEMABINDING
BEGIN
    DECLARE @patientIdentifier nvarchar(128)

    ;WITH XMLNAMESPACES(DEFAULT 'http://domain.com/product/Schemas', 'urn:hl7-org:v3' as hl7ns)
    SELECT 
       @patientIdentifier = CASE @messageType
                               WHEN 'CCD' THEN @xmlData.value('(hl7ns:ClinicalDocument/hl7ns:recordTarget/hl7ns:patientRole/hl7ns:id/@extension)[1]', 'varchar(128)')
                               WHEN 'PatientAdverseReactionRequest' THEN @xmlData.value('(PatientAdverseReactionRequest/Patient/Identifiers/Identifier/Id)[1]', 'varchar(128)')
                               WHEN 'UnsolicitedDocumentType' THEN @xmlData.value('(DocumentManagementRequest/Patient/Identifiers/Identifier/Id)[1]', 'varchar(128)')
                               WHEN 'UnsolicitedLabResult' THEN @xmlData.value('(UnsolicitedLabResult/Patient/Identifiers/Identifier/Id)[1]', 'varchar(128)')
                               ELSE ''
                             END

    RETURN @patientIdentifier
END
  

Вот XML с идентификатором пациента, который мне нужно извлечь как локально определенный идентификатор пациента:

 <ProcessCcdRequest xmlns="http://domain.com/product/Schemas">
<Ccd>amp;<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 CDA.xsd"amp;>amp;<realmCode code="US"/amp;>amp;<typeId extension="POCD_HD000040" root="2.16.840.1.113883.1.3"/amp;>amp;<templateId root="2.16.840.1.113883.10.20.22.1.1"/amp;>amp;<templateId root="2.16.840.1.113883.10.20.22.1.2"/amp;>amp;<id root="2.25.126274596634328418155136651226877799755"/amp;>amp;<code code="34133-9" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Summarization of episode note"/amp;>amp;<titleamp;>Clinical Document Architectureamp;</titleamp;>amp;<effectiveTime value="20140619191531-0400"/amp;>amp;<confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25"/amp;>amp;<languageCode code="en-US"/amp;>amp;<recordTargetamp;>amp;<patientRoleamp;>amp;<id assigningAuthorityName="Enterprise MPI Number" extension="000000001" root="1.3.6.1.4.1.26923.99.1.1.1.2.1"/amp;>amp;<id assigningAuthorityName="Enterprise MPI Number" extension="000000001" root="1.3.6.1.4.1.26923.99.1.1.1.2.1"/amp;>amp;<id assigningAuthorityName="SSN" extension="999999999" root="2.16.840.1.113883.4.1"/amp;>amp;<id assigningAuthorityName="Hospital: Locally defined Patient Account Number" extension="000222222222" root="1.3.6.1.4.1.26923.99.1.1.44273.7.3"/amp;>amp;<addr use="HP"amp;>amp;<streetAddressLineamp;>111111 Sw 53Rd Stamp;</streetAddressLineamp;>amp;<cityamp;>AnyTownamp;</cityamp;>amp;<stateamp;>FLamp;</stateamp;>amp;<postalCodeamp;>33175amp;</postalCodeamp;>amp;<countryamp;>United States of Americaamp;</countryamp;>amp;</addramp;>amp;<telecom use="HP" value="tel:111-222-5555"/amp;>amp;<patientamp;>amp;<name use="L"amp;>amp;<givenamp;>Namesamp;</givenamp;>amp;<familyamp;>NamesNamesamp;</familyamp;>amp;</nameamp;>amp;<administrativeGenderCode code="M" codeSystem="2.16.840.1.113883.5.1" codeSystemName="HL7 AdministrativeGenderCodes" displayName="Male"/amp;>amp;<birthTime value="19500326"/amp;>amp;<maritalStatusCode code="M" codeSystem="2.16.840.1.113883.5.2" codeSystemName="MaritalStatusCode" displayName="Married"/amp;>amp;<raceCode code="2106-3" codeSystem="2.16.840.1.113883.6.238" codeSystemName="Race amp;amp;amp; Ethnicity - CDC" displayName="White Hispanic"/amp;>amp;<sdtc:raceCode codeSystem="2.16.840.1.113883.6.238" codeSystemName="Race amp;amp;amp; Ethnicity - CDC" nullFlavor="NI"/amp;>amp;<sdtc:raceCode codeSystem="2.16.840.1.113883.6.238" codeSystemName="Race amp;amp;amp; Ethnicity - CDC" nullFlavor="NI"/amp;>amp;<ethnicGroupCode code="2135-2" codeSystem="2.16.840.1.113883.6.238" codeSystemName="Race amp;amp;amp; Ethnicity - CDC" displayName="Hispanic"/amp;>amp;<languageCommunicationamp;>amp;<languageCode code="spa"/amp;>amp;<preferenceInd value="true"/amp;>amp;</languageCommunicationamp;>amp;</patientamp;>amp;<providerOrganizationamp;>amp;<id assigningAuthorityName="Hospital" extension="Entity: EDA" root="2.16.840.1.114060.6.3.1.4.1"/amp;>amp;<nameamp;>Hospitalamp;</nameamp;>amp;<telecom use="WP" value="tel:111-111-2222"/amp;>amp;<addr use="WP"amp;>amp;<streetAddressLineamp;>11111 N 1st Avenueamp;</streetAddressLineamp;>amp;<cityamp;>AnyTownamp;</cityamp;>amp;<stateamp;>FLamp;</stateamp;>amp;<postalCodeamp;>12345amp;</postalCodeamp;>amp;<countryamp;>United States of Americaamp;</countryamp;>amp;</addramp;>amp;</providerOrganizationamp;>amp;</patientRoleamp;>amp;</recordTargetamp;>amp;<authoramp;>amp;<time value="20140619191531-0400"/amp;>amp;<assignedAuthoramp;>amp;<id assigningAuthorityName="NPI" extension="1234567891" root="2.16.840.1.113883.4.6"/amp;>amp;<addramp;>amp;<streetAddressLine nullFlavor="NI"/amp;>amp;<city nullFlavor="NI"/amp;>amp;<state nullFlavor="NI"/amp;>amp;<postalCode nullFlavor="NI"/amp;>amp;<country nullFlavor="NI"/amp;>amp;</addramp;>amp;<telecom value="tel:111-222-4444 ext:"/amp;>amp;<assignedPersonamp;>amp;<nameamp;>amp;<givenamp;>OthLastNameiamp;</givenamp;>amp;<familyamp;>LastName-Manamp;</familyamp;>amp;</nameamp;>amp;</assignedPersonamp;>amp;<representedOrganizationamp;>amp;<id extension="W0CL" root="2.16.840.1.114060.6.3.1.4.1"/amp;>amp;<nameamp;> Hospital amp;</nameamp;>amp;<telecom value="tel:111-111-2222"/amp;>amp;<addramp;>amp;<streetAddressLineamp;>11111 N 1st Avenueamp;</streetAddressLineamp;>amp;<cityamp;>AnyTownamp;</cityamp;>amp;<stateamp;>FLamp;</stateamp;>amp;<postalCodeamp;>12345amp;</postalCodeamp;>amp;<countryamp;>United States of Americaamp;</countryamp;>amp;</addramp;>amp;</representedOrganizationamp;>amp;</assignedAuthoramp;>amp;</authoramp;>amp;<custodianamp;>amp;<assignedCustodianamp;>amp;<representedCustodianOrganizationamp;>amp;<!-- OID is OID for Custodian hospital name --amp;>amp;<id extension="W0CL" root="2.16.840.1.114060.6.3.1.4.1"/amp;>amp;<nameamp;>Hospitalamp;</nameamp;>amp;<telecom value="tel:111-111-2222"/amp;>amp;<addramp;>amp;<streetAddressLineamp;>11111 N 1st Avenueamp;</streetAddressLineamp;>amp;<cityamp;>AnyTownamp;</cityamp;>amp;<stateamp;>FLamp;</stateamp;>amp;<postalCodeamp;>12345amp;</postalCodeamp;>amp;<countryamp;>United States of Americaamp;</countryamp;>amp;</addramp;>amp;</representedCustodianOrganizationamp;>amp;</assignedCustodianamp;>amp;</custodianamp;>amp;<documentationOfamp;>amp;<serviceEvent classCode="PCPR"amp;>amp;<effectiveTimeamp;>amp;<low value="20140614"/amp;>amp;<high value="20140619"/amp;>amp;</effectiveTimeamp;>amp;</serviceEventamp;>amp;</documentationOfamp;>amp;<componentOfamp;>amp;<encompassingEncounteramp;>amp;<id extension="000000123456" root="2.16.840.1.113883.19"/amp;>amp;<effectiveTimeamp;>amp;<low value="201406141743"/amp;>amp;<high value="201406191843"/amp;>amp;</effectiveTimeamp;>amp;<encounterParticipant typeCode="CON"amp;>amp;<assignedEntityamp;>amp;<id assigningAuthorityName="NPI" extension="1111111111" root="2.16.840.1.113883.4.6"/amp;>amp;<addr use="WP"amp;>amp;<streetAddressLine nullFlavor="NI"/amp;>amp;<city nullFlavor="NI"/amp;>amp;<state nullFlavor="NI"/amp;>amp;<postalCode nullFlavor="NI"/amp;>amp;<country nullFlavor="NI"/amp;>amp;</addramp;>amp;<telecom use="WP" value="tel:123-123-1234 ext:"amp;>  amp;</telecomamp;>amp;<assignedPersonamp;>amp;<nameamp;>amp;<givenamp;>John Jamp;</givenamp;>amp;<familyamp;>Snowamp;</familyamp;>amp;</nameamp;>amp;</assignedPersonamp;>amp;</assignedEntityamp;>amp;</encounterParticipantamp;>amp;<encounterParticipant typeCode="ADM"amp;>amp;<assignedEntityamp;>amp;<id assigningAuthorityName="NPI" extension="1234567891" root="2.16.840.1.113883.4.6"/amp;>amp;<addr use="WP"amp;>amp;<streetAddressLine nullFlavor="NI"/amp;>amp;<city nullFlavor="NI"/amp;>amp;<state nullFlavor="NI"/amp;>amp;<postalCode nullFlavor="NI"/amp;>amp;<country nullFlavor="NI"/amp;>amp;</addramp;>amp;<telecom use="WP" value="tel:111-222-4444 ext:"amp;>  amp;</telecomamp;>amp;<assignedPersonamp;>amp;<nameamp;>amp;<givenamp;>OthLastNameiamp;</givenamp;>amp;<familyamp;>LastName-Manamp;</familyamp;>amp;</nameamp;>amp;</assignedPersonamp;>amp;</assignedEntityamp;>amp;</encounterParticipantamp;>amp;<encounterParticipant typeCode="ATND"amp;>amp;<assignedEntityamp;>amp;<id assigningAuthorityName="NPI" extension="1234567891" root="2.16.840.1.113883.4.6"/amp;>amp;<addr use="WP"amp;>amp;<streetAddressLine nullFlavor="NI"/amp;>amp;<city nullFlavor="NI"/amp;>amp;<state nullFlavor="NI"/amp;>amp;<postalCode nullFlavor="NI"/amp;>amp;<country nullFlavor="NI"/amp;>amp;</addramp;>amp;<telecom use="WP" value="tel:111-222-4444 ext:"amp;>  amp;</telecomamp;>amp;<assignedPersonamp;>amp;<nameamp;>amp;<givenamp;>OthLastNameiamp;</givenamp;>amp;<familyamp;>LastName-Manamp;</familyamp;>amp;</nameamp;>amp;</assignedPersonamp;>amp;</assignedEntityamp;>amp;</encounterParticipantamp;>amp;<locationamp;>amp;<healthCareFacilityamp;>amp;<id assigningAuthorityName="Hospital" extension="hosp svc:EDA" root="2.16.840.1.114060.6.3.1.4.1"/amp;>amp;<locationamp;>amp;<nameamp;>Inpatient Via Ed-Edaamp;</nameamp;>amp;<addr use="WP"amp;>amp;<streetAddressLineamp;>11111 N 1st Avenueamp;</streetAddressLineamp;>amp;<cityamp;>AnyTownamp;</cityamp;>amp;<stateamp;>FLamp;</stateamp;>amp;<postalCodeamp;>12345amp;</postalCodeamp;>amp;<countryamp;>United States of Americaamp;</countryamp;>amp;</addramp;>amp;</locationamp;>amp;</healthCareFacilityamp;>amp;</locationamp;>amp;</encompassingEncounteramp;>amp;</componentOfamp;>amp;<componentamp;>amp;<structuredBodyamp;>amp;<
  

Для удобства чтения содержимое <Ccd> элемента, когда оно не экранировано (проанализировано), выглядит следующим образом:

 <ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 CDA.xsd">
  <realmCode code="US"/>
  <typeId extension="POCD_HD000040" root="2.16.840.1.113883.1.3"/>
  <templateId root="2.16.840.1.113883.10.20.22.1.1"/>
  <templateId root="2.16.840.1.113883.10.20.22.1.2"/>
  <id root="2.25.126274596634328418155136651226877799755"/>
  <code code="34133-9" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Summarization of episode note"/>
  <title>Clinical Document Architecture</title>
  <effectiveTime value="20140619191531-0400"/>
  <confidentialityCode code="N" codeSystem="2.16.840.1.113883.5.25"/>
  <languageCode code="en-US"/>
  <recordTarget>
    <patientRole>
      <id assigningAuthorityName="Enterprise MPI Number" extension="000000001" root="1.3.6.1.4.1.26923.99.1.1.1.2.1"/>
      <id assigningAuthorityName="Enterprise MPI Number" extension="000000001" root="1.3.6.1.4.1.26923.99.1.1.1.2.1"/>
      <id assigningAuthorityName="SSN" extension="999999999" root="2.16.840.1.113883.4.1"/>
      <id assigningAuthorityName="Hospital: Locally defined Patient Account Number" extension="000222222222" root="1.3.6.1.4.1.26923.99.1.1.44273.7.3"/>
      ...
  

Комментарии:

1. пожалуйста, укажите базу данных sql, которую вы используете, из-за различий в функциях

2. Я предполагаю, что вам нужен ответ STAT!

3. 🙂 Ну, оказывается, я извлекал неправильный идентификатор и что он извлекает первый, который он находит. Исходная система статична, поэтому я подумал, что могу претендовать на это, но xml может быть хрупким

4. Размещенный вами XML-файл неправильно сформирован: он заканчивается неполной ссылкой на объект, а конечные теги отсутствуют. Таким образом, на самом деле это не может быть фрагмент XML, который вы получаете от использования XPath.

5. Я добавил только первый раздел, потому что остальные мне не нужны. раздел является первой частью, КОГДА «CCD». Кажется, я просто не могу заставить его пройти первый. Тот, который я хочу, находится в 4-м расширении id / @

Ответ №1:

Ваше заявление

 WHEN 'CCD' THEN @xmlData.value('(hl7ns:ClinicalDocument/hl7ns:recordTarget/
                  hl7ns:patientRole/hl7ns:id/@extension)[1]', 'varchar(128)')
  

выбирает, как вы говорите, первое расширение PatientRole / id / @ (из-за [1] ). Но вам нужен локально определенный идентификатор пациента, т.е.

   <id assigningAuthorityName="Hospital: Locally defined Patient Account Number" 
       extension="000222222222" root="1.3.6.1.4.1.26923.99.1.1.44273.7.3"/>
  

Таким образом, вы можете изменить выражение XPath вашего оператора WHEN на фильтр на основе значения assigningAuthorityName атрибута:

 WHEN 'CCD' THEN @xmlData.value('(hl7ns:ClinicalDocument/hl7ns:recordTarget/
   hl7ns:patientRole/hl7ns:id[
      assigningAuthorityName="Hospital: Locally defined Patient Account Number"]/
     @extension)[1]', 'varchar(128)')
  

(разбито, чтобы вам не приходилось прокручивать вбок).

Это даст вам @extension первое <id> , чье assigningAuthorityName есть "Hospital: Locally defined Patient Account Number" .

Комментарии:

1. Итак, если я хочу получить идентификаторы пациентов из нескольких учреждений, я бы поставил ИЛИ, например: <id assigningAuthorityName=»Больница: локально определенный номер учетной записи пациента» extension=»000222222222″ root =»1.3.6.1.4.1.26923.99.1.1.44273.7.3″/> илиНомер» расширение =»000222222222″ корень =»1.3.6.1.4.1.26923.99.1.1.44273.7.3″/>

2. @user3739288: гм … вы говорите об изменении входного XML?

3. Ваш код был на месте, но вместо настройки в соответствии с назначением авторизации я заметил, что он постоянно находится в [4], поэтому я создал функцию с помощью [4] и добавил ее в столбец. Сработало как шарм. Спасибо, Ларс!

4. @user3739288: Рад, что у вас получилось. Я избегал [4] из-за того, что вы сказали о «XML хрупкий»… Я думал, вы пытаетесь быть осторожным, чтобы не использовать менее надежное выражение. В любом случае, если вы знаете, что это работает на всех ваших входных данных, отлично.