#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 хрупкий»… Я думал, вы пытаетесь быть осторожным, чтобы не использовать менее надежное выражение. В любом случае, если вы знаете, что это работает на всех ваших входных данных, отлично.