T-SQL XML在一个父项下创建多个重复字段

时间:2018-09-26 15:24:26

标签: xml tsql

尝试使用T-SQL创建XML。第一次完成这种格式,但没有成功。

我需要这个:

<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 :(得分:2)

有关使用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的Procedures子节点。

然后对嵌套选择进行一些调整,以将“ OtherProcedures”和“ Procedures”引入:

    (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

答案 1 :(得分:1)

下一次添加消耗性测试数据将是一件很棒的事情,最好是独立 sceanrio read about 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]。引擎看到,该元素已经打开,无需打开另一个元素。所以整个东西都放在了当前元素中。