尝试使用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');
答案 0 :(得分:2)
有关使用PATH模式的示例,请参考此链接:
进行一些调整,我想您会获得理想的输出。
具有这一行:
'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]
。引擎看到,该元素已经打开,无需打开另一个元素。所以整个东西都放在了当前元素中。