T-SQL XML Создание многократно повторяющихся полей под одним родителем - PullRequest
0 голосов
/ 26 сентября 2018

Попытка создать XML с T-SQL.Первый раз я сделал этот формат, но у меня ничего не получилось.

Мне нужно это:

<record>
    <MedicalRecordNumber>21QWYZ12345ABC</MedicalRecordNumber> 
    <DischargeDate>2018-06-01</DischargeDate>    
    <Procedures>
        <PrincipalProcedure>P01198</PrincipalProcedure> 
        <OtherProcedure>P03245</OtherProcedure> 
        <OtherProcedure>P05624</OtherProcedure> 
    </Procedures> 
</Record>

Но самое близкое, что я получил, это:

<record>
    <MedicalRecordNumber>JH26557923</MedicalRecordNumber>
    <DischargeDate>2018-03-12</DischargeDate>
    <Procedures code="Procedures">
        <PrincipalProcedure>abc1234</PrincipalProcedure>
    </Procedures>
    <OtherProcedures>
        <OtherProcedure>abc</OtherProcedure>
    </OtherProcedures>
    <OtherProcedures>
        <OtherProcedure>def</OtherProcedure>
    </OtherProcedures>
</record>

Это мой запрос, где Encounters - это родительская таблица, а Procedures - это дочерняя таблица в отношении 1: много:

select
    Encounters.MedicalRecordNumber,
    dbo.Encounters.DischargeDate,
    'Procedures' as 'Procedures/@code',
    Encounters.PrimaryProcedure as 'Procedures/PrincipalProcedure',
    (select 
         JHHSProcedures.ProcedureCode as OtherProcedure
     from  
         JHHSProcedures
     where 
         JHHSProcedures.MedicalRecordNumber = Encounters.MedicalRecordNumber
         and JHHSProcedures.DisDate = dbo.Encounters.DischargeDate
     for xml path('OtherProcedures'), type)
from  
    Encounters
for xml path('record');

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

В следующий раз было бы здорово добавить расходные данные испытаний, лучше всего было бы автономно sceanrio , прочитав о MCVE .Я сделал это для вас, предоставив макетные таблицы.

Попробуйте это так:

DECLARE @mockEncounters TABLE(MedicalRecordNumber VARCHAR(100),DischargeDate DATE,PrimaryProcedure VARCHAR(100));
INSERT INTO @mockEncounters VALUES('21QWYZ12345ABC','20180601','P01198');

DECLARE @mockJHHSProcedures TABLE(MedicalRecordNumber VARCHAR(100),DisDate DATE,ProcedureCode VARCHAR(100));
INSERT INTO @mockJHHSProcedures VALUES('21QWYZ12345ABC','20180601','P03245')
                                     ,('21QWYZ12345ABC','20180601','P05624');

- запрос довольно близок к вашему, но прочитайте мои советы ниже:

SELECT 
    Encounters.MedicalRecordNumber,
    Encounters.DischargeDate,
    Encounters.PrimaryProcedure AS [Procedures/PrincipalProcedure],
    (SELECT 
         JHHSProcedures.ProcedureCode AS OtherProcedure
     FROM  
         @mockJHHSProcedures AS JHHSProcedures
     WHERE 
         JHHSProcedures.MedicalRecordNumber = Encounters.MedicalRecordNumber
         and JHHSProcedures.DisDate = Encounters.DischargeDate
     FOR XML PATH(''), TYPE) AS [Procedures]
FROM  
    @mockEncounters AS Encounters
FOR XML PATH('record');

Результат

<record>
  <MedicalRecordNumber>21QWYZ12345ABC</MedicalRecordNumber>
  <DischargeDate>2018-06-01</DischargeDate>
  <Procedures>
    <PrincipalProcedure>P01198</PrincipalProcedure>
    <OtherProcedure>P03245</OtherProcedure>
    <OtherProcedure>P05624</OtherProcedure>
  </Procedures>
</record>

С этой строкой

    Encounters.PrimaryProcedure AS [Procedures/PrincipalProcedure],

... вы говорите движку: «Откройте элемент <Procedures> и добавьтеэлемент <PrincipalProcedure>.

Подвыбор вызывает каждый выход AS OtherProcedure с пустым PATH(''), что приводит к выполнению в одиночку к этому:

<OtherProcedure>P03245</OtherProcedure>
<OtherProcedure>P05624</OtherProcedure>

TYPE будет сохранять это как собственный XML и этот AS [Procedure]. Движок видит, что этот элемент уже открыт, нет необходимости открывать другой. Таким образом, все это помещается в текущий элемент.

0 голосов
/ 26 сентября 2018

Ссылка на эту ссылку для примеров использования режима PATH:

https://docs.microsoft.com/en-us/sql/relational-databases/xml/examples-using-path-mode?view=sql-server-2017

Несколько настроек, и я думаю, вы получите желаемый результат.

Имея этострока:

'Procedures' as 'Procedures/@code',

- это то, что вызывает:

<Procedures code="Procedures">

в вашем выводе.

Удалите это, оно не нужно.

Эта строка:

Encounters.PrimaryProcedure as 'Procedures/PrincipalProcedure',

в основном даст вам ваш подузел процедур с внутренним PrincipalProcedure.

Затем несколько настроек для вложенного выбора, чтобы ввести "OtherProcedures" с "Процедурами":

    (SELECT field AS 'OtherProcedure' --The field as 'OtherProcedure'
    FROM ChildTable b
    WHERE ChildTable.Field = ParentTable.Field
            AND ChildTale.Date = ParentTable.Date
    FOR XML PATH(''), TYPE) AS 'Procedures' --Don't set the node in the PATH here, entire nested select as 'Procedures' is what you want
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...