2012-04-25 5 views
3

T-SQL을 사용하여 CCD의 기본 구문 분석을 수행하는 방법을 알아 냈습니다. 결과를 공유 할 것이라고 생각했습니다.T-SQL을 사용하여 케어 문서 (CCD)의 구문 분석

누군가 더 좋은 방법을 알고 있다면 언제든지 알려주세요. 특히 네임 스페이스 선언과 관련된 텍스트를 줄이는 데 관심이 있습니다.

내가 단순히 네임 스페이스를 제거 할 수 있습니다 알고 (의 xmlns =는 "항아리 : HL7-조직 : V3") 원래 XML에서, 그러나, 나는 그렇게하지 않으려는 것입니다. 적어도 라인 랩을 줄일 수

DECLARE @ClinicalDocumentXml xml 
-- Full document available from http://xreg2.nist.gov/cda-validation/downloads.html 
SET @ClinicalDocumentXml = '<?xml version="1.0" encoding="UTF-8"?> 
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd"> 
    <realmCode code="US"/> 
    <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/> 
    <templateId root="2.16.840.1.113883.3.27.1776" assigningAuthorityName="CDA/R2"/> 
    <templateId root="2.16.840.1.113883.10.20.3" assigningAuthorityName="HL7/CDT Header"/> 
    <templateId root="1.3.6.1.4.1.19376.1.5.3.1.1.1" assigningAuthorityName="IHE/PCC"/> 
    <templateId root="2.16.840.1.113883.3.88.11.32.1" assigningAuthorityName="HITSP/C32"/> 
    <id root="2.16.840.1.113883.3.72" extension="MU_Rev1_HITSP_C32C83_4Sections_NoInformationEntries_NoErrors" assigningAuthorityName="NIST Healthcare Project"/> 
    <code code="34133-9" displayName="Summarization of episode note" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/> 
    <title/> 
    <effectiveTime value="20101026130945"/> 
    <confidentialityCode/> 
    <languageCode code="en-US"/> 
    <recordTarget> 
     <patientRole> 
      <id root="ProviderID" extension="PatientID" assigningAuthorityName="Provider Name"/> 
      <addr use="HP"> 
       <streetAddressLine>First Address Line</streetAddressLine> 
       <streetAddressLine>Next Address line</streetAddressLine> 
       <city>CityName</city> 
       <state>StateName</state> 
       <postalCode>00000-0000</postalCode> 
       <country>USA</country> 
      </addr> 
      <telecom value="tel:+1-(555)555-1212" use="HP" /> 
      <patient> 
       <name> 
        <given>FirstName</given> 
        <given>MiddleNameorInitial</given> 
        <family>FamilyName</family> 
       </name> 
       <administrativeGenderCode code="F" displayName="Female" codeSystem="2.16.840.1.113883.5.1" codeSystemName="HL7 AdministrativeGender"/> 
       <birthTime value="19840704"/> 
       <maritalStatusCode code="S" displayName="Single" codeSystem="2.16.840.1.113883.5.2" codeSystemName="HL7 Marital status"/> 
       <languageCommunication> 
        <templateId root="2.16.840.1.113883.3.88.11.83.2" assigningAuthorityName="HITSP/C83"/> 
        <templateId root="1.3.6.1.4.1.19376.1.5.3.1.2.1" assigningAuthorityName="IHE/PCC"/> 
        <languageCode code="en-US"/> 
       </languageCommunication> 
      </patient> 
     </patientRole> 
    </recordTarget> 
</ClinicalDocument>' 

SELECT 
    Field.value('declare default element namespace "urn:hl7-org:v3";title[1]', 'varchar(255)') AS Title, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/id[1]/@extension', 'varchar(255)') AS InternalPatientID, 
    Field.value('declare default element namespace "urn:hl7-org:v3";effectiveTime[1]/@value', 'varchar(255)') AS CreationDateTime, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/patient[1]/name[1]/name[1]', 'varchar(255)') AS FullName, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/patient[1]/name[1]/family[1]', 'varchar(255)') AS LastName, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/patient[1]/name[1]/given[1]', 'varchar(255)') AS FirstName, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/patient[1]/name[1]/given[2]', 'varchar(255)') AS MiddleName, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/patient[1]/birthTime[1]/@value', 'varchar(255)') AS DateOfBirth, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/patient[1]/administrativeGenderCode[1]/@code', 'varchar(255)') AS Gender, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/addr[1]/streetAddressLine[1]', 'varchar(255)') AS PatientAddress, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/addr[1]/streetAddressLine[2]', 'varchar(255)') AS PatientAddress2, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/addr[1]/city[1]', 'varchar(255)') AS PatientCity, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/addr[1]/state[1]', 'varchar(255)') AS PatientState, 
    Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/addr[1]/postalCode[1]', 'varchar(255)') AS PatientZip, 
    Replace(Field.value('declare default element namespace "urn:hl7-org:v3";recordTarget[1]/patientRole[1]/telecom[1]/@value', 'varchar(255)'), 'tel:', '') AS HomePhone 
FROM @ClinicalDocumentXml.nodes('declare default element namespace "urn:hl7-org:v3"; ClinicalDocument') CCD(Field) 
+0

질문은 있지만 좋은 질문이 아니며 stackoverflow는 Q & A 형식으로 답변 할 수있는 실제 질문을 처리하는 경향이 있습니다. – hkf

답변

1

당신은 WITH XMLNAMESPACES를 사용할 수 있습니다.

WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3') 
SELECT 
    Field.value('title[1]', 'varchar(255)') AS Title, 
    Field.value('(recordTarget/patientRole/id/@extension)[1]', 'varchar(255)') AS InternalPatientID, 
    Field.value('(effectiveTime/@value)[1]', 'varchar(255)') AS CreationDateTime, 
    Field.value('(recordTarget/patientRole/patient/name/name)[1]', 'varchar(255)') AS FullName, 
    Field.value('(recordTarget/patientRole/patient/name/family)[1]', 'varchar(255)') AS LastName, 
    Field.value('(recordTarget/patientRole/patient/name/given)[1]', 'varchar(255)') AS FirstName, 
    Field.value('(recordTarget/patientRole/patient/name/given)[2]', 'varchar(255)') AS MiddleName, 
    Field.value('(recordTarget/patientRole/patient/birthTime/@value)[1]', 'varchar(255)') AS DateOfBirth, 
    Field.value('(recordTarget/patientRole/patient/administrativeGenderCode/@code)[1]', 'varchar(255)') AS Gender, 
    Field.value('(recordTarget/patientRole/addr/streetAddressLine)[1]', 'varchar(255)') AS PatientAddress, 
    Field.value('(recordTarget/patientRole/addr/streetAddressLine)[2]', 'varchar(255)') AS PatientAddress2, 
    Field.value('(recordTarget/patientRole/addr/city)[1]', 'varchar(255)') AS PatientCity, 
    Field.value('(recordTarget/patientRole/addr/state)[1]', 'varchar(255)') AS PatientState, 
    Field.value('(recordTarget/patientRole/addr/postalCode)[1]', 'varchar(255)') AS PatientZip, 
    Replace(Field.value('(recordTarget/patientRole/telecom/@value)[1]', 'varchar(255)'), 'tel:', '') AS HomePhone 
FROM @ClinicalDocumentXml.nodes('ClinicalDocument') CCD(Field) 

cross apply을 사용하여 조금 더 짧게 만들 수도 있습니다.

WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3') 
SELECT 
    CD.Field.value('title[1]', 'varchar(255)') AS Title, 
    PR.Field.value('(id/@extension)[1]', 'varchar(255)') AS InternalPatientID, 
    CD.Field.value('(effectiveTime/@value)[1]', 'varchar(255)') AS CreationDateTime, 
    PR.Field.value('(patient/name/name)[1]', 'varchar(255)') AS FullName, 
    PR.Field.value('(patient/name/family)[1]', 'varchar(255)') AS LastName, 
    PR.Field.value('(patient/name/given)[1]', 'varchar(255)') AS FirstName, 
    PR.Field.value('(patient/name/given)[2]', 'varchar(255)') AS MiddleName, 
    PR.Field.value('(patient/birthTime/@value)[1]', 'varchar(255)') AS DateOfBirth, 
    PR.Field.value('(patient/administrativeGenderCode/@code)[1]', 'varchar(255)') AS Gender, 
    PR.Field.value('(addr/streetAddressLine)[1]', 'varchar(255)') AS PatientAddress, 
    PR.Field.value('(addr/streetAddressLine)[2]', 'varchar(255)') AS PatientAddress2, 
    PR.Field.value('(addr/city)[1]', 'varchar(255)') AS PatientCity, 
    PR.Field.value('(addr/state)[1]', 'varchar(255)') AS PatientState, 
    PR.Field.value('(addr/postalCode)[1]', 'varchar(255)') AS PatientZip, 
    Replace(PR.Field.value('(telecom/@value)[1]', 'varchar(255)'), 'tel:', '') AS HomePhone 
FROM 
    (SELECT @ClinicalDocumentXml.query('/ClinicalDocument/*')) AS CD(Field) 
CROSS APPLY 
    (SELECT CD.Field.query('recordTarget/patientRole/*')) AS PR(Field) 
+0

미카엘, 고마워. 그게 바로 제가 찾고 있던 것입니다. – bfox

1

일반의 변화 :

DECLARE @namespace varchar(75); 
SET @namespace = 'declare default element namespace "urn:hl7-org:v3";'; 

SELECT 
    Field.value(@namespace + 'title[1]', 'varchar(255)') AS Title, 
    ...