SQL填充xml列表中的值

时间:2014-05-15 18:47:08

标签: sql-server xml tsql

在SQL Server sproc中,我需要使用源自两个不同表的数据生成xml。在下面的示例中,EPI类型的患者编号来自一个表格,MRN类型的患者编号来自另一个表格。要创建xml,我使用UNION来组合来自两个不同的select语句的记录,然后使用' FOR XML PATH'。是否有不同的方式 - 例如使用两个选择子查询而不使用UNION?

<Patients>
  <Patient>
    <Number>1234</Number>
    <NumberType>EPI</NumberType>
  </Patient>
  <Patient>
    <Number>5678</Number>
    <NumberType>MRN</NumberType>
  </Patient>
</Patients>

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我理解了您对我的问题的回答,那么您并没有真正加入PatientId上的表格,您只是创建了两个表格中所有数据的列表,而您无需按患者分组记录。 / p>

是的,UNION是完成单个列表的最简单方法。

但是,由于您要输出xml,根据您的问题,可以在没有UNION的情况下完成备用: 假设您有两个表可能如下所示:

CREATE TABLE SrcA (PatientId int, NumberA int, TypeA varchar(16));
CREATE TABLE SrcB (PatientId int, NumberB int, TypeB varchar(16));

使用这样的样本值(注意每个表的一个记录不在另一个表中):

INSERT INTO SrcA VALUES(100, 1234, 'EPI'), (200, 2222, 'EPI'), (400, 4444, 'EPI');
INSERT INTO SrcB VALUES(100, 5678, 'MRN'), (200, 2121, 'MRN'), (300, 3131, 'MRN');

然后是以下查询:

          SELECT
                 (SELECT SA.NumberA AS Number, SA.TypeA AS NumberType WHERE SA.NumberA IS NOT NULL FOR XML PATH('Patient'), TYPE),
                 (SELECT SB.NumberB AS Number, SB.TypeB AS NumberType WHERE SB.NumberB IS NOT NULL FOR XML PATH('Patient'), TYPE)
            FROM SrcA SA
 FULL OUTER JOIN SrcB SB ON SA.PatientId = SB.PatientId
         FOR XML PATH(''), ROOT('Patients')

将产生:

<Patients>
  <Patient>
    <Number>1234</Number>
    <NumberType>EPI</NumberType>
  </Patient>
  <Patient>
    <Number>5678</Number>
    <NumberType>MRN</NumberType>
  </Patient>
  <Patient>
    <Number>2222</Number>
    <NumberType>EPI</NumberType>
  </Patient>
  <Patient>
    <Number>2121</Number>
    <NumberType>MRN</NumberType>
  </Patient>
  <Patient>
    <Number>4444</Number>
    <NumberType>EPI</NumberType>
  </Patient>
  <Patient>
    <Number>3131</Number>
    <NumberType>MRN</NumberType>
  </Patient>
</Patients>