如何从SQL查询中获取特定XML格式的结果?

时间:2013-11-21 20:51:19

标签: sql-server xml tsql path

我有以下要转换为XML文件的T-SQL查询。我试图使用FOR XML Path,但这不是我需要的方式。 这是我的T-SQL表定义:

create table TN_DataFeed
(
--Patient uniqueidentifier,
ProviderPatientNo varchar(50) null, 
LastName varchar(25), 
FirstName varchar(25), 
SSN char(9) null, 
DOB char(10) null,
Gender tinyint null, 
Race tinyint null, 
Ethnicity tinyint null, 
--PhoneAssessment varchar(50), 
ProviderPhoneAssessmentID varchar(50), 
CallEndDate char(10), 
CallEndTime varchar(8)
)

我的数据符合上述格式并成功插入。但我需要我的XML看起来像:

<Patient>
  <ProviderPatientNo>ProviderPatientNo0</ProviderPatientNo>
  <LastName>LastName0</LastName>
  <FirstName>FirstName0</FirstName>
  <SSN>000000000</SSN>
  <DOB>2006-05-04</DOB>
  <Gender>1</Gender>
  <Race>1</Race>
  <Ethnicity>1</Ethnicity>
  <PhoneAssessment>
    <ProviderPhoneAssessmentId>52854541</ProviderPhoneAssessmentId>
    <CallEndDate>2006-05-04</CallEndDate>
    <CallEndTime>01:01:01.001</CallEndTime>
  </PhoneAssessment>
</Patient>

这是我用于检索上述T-SQL查询的XML Path代码:

select 
ProviderPatientNo,
LastName,FirstName,SSN,DOB,Gender,Race,Ethnicity,
(
    select distinct
    ProviderPhoneAssessmentId, CallEndDate, CallEndTime
    from TN_DataFeed
For XML path ('PhoneAssessment'), root('PhoneAssessment2'), type
)
from TN_DataFeed
For XML path ('Patient'), root('Patient_root'), type

请注意,我还没有包含所有列。相反,我只是想让患者部分工作。请注意下面的示例XML文件中显示了Patient如何是ProviderPatientNo,LastName,FirstName,SSN,DOB,Gender,Race和Ethnicity的父节点的部分。

但是,我上面的XML Path的XML输出是:

<Patient_root>
  <Patient>
    <ProviderPatientNo>00200543</ProviderPatientNo>
    <LastName>Ga</LastName>
    <FirstName>Ti</FirstName>
    <SSN>4108</SSN>
    <DOB>1998-08-16</DOB>
    <Gender>2</Gender>
    <Race>2</Race>
    <Ethnicity>3</Ethnicity>
    <PhoneAssessment2>
      <PhoneAssessment>
        <ProviderPhoneAssessmentId>BEA5487B-82E9-4226-B883-BFBFE7EF2B1A</ProviderPhoneAssessmentId>
        <CallEndDate>2013-09-16</CallEndDate>
        <CallEndTime>22:00:00</CallEndTime>
      </PhoneAssessment>
      <PhoneAssessment>
        <ProviderPhoneAssessmentId>C8F39E2F-BC4A-48AD-BD07-C07EB8384AD7</ProviderPhoneAssessmentId>
        <CallEndDate>2013-09-16</CallEndDate>
        <CallEndTime>16:24:00</CallEndTime>
      </PhoneAssessment>
    </PhoneAssessment2>
  </Patient>
  <Patient>
    <ProviderPatientNo>00200543</ProviderPatientNo>
    <LastName>Ga</LastName>
    <FirstName>Ti</FirstName>
    <SSN>4108</SSN>
    <DOB>1998-08-16</DOB>
    <Gender>2</Gender>
    <Race>2</Race>
    <Ethnicity>3</Ethnicity>
    <PhoneAssessment2>
      <PhoneAssessment>
        <ProviderPhoneAssessmentId>BEA5487B-82E9-4226-B883-BFBFE7EF2B1A</ProviderPhoneAssessmentId>
        <CallEndDate>2013-09-16</CallEndDate>
        <CallEndTime>22:00:00</CallEndTime>
      </PhoneAssessment>
      <PhoneAssessment>
        <ProviderPhoneAssessmentId>C8F39E2F-BC4A-48AD-BD07-C07EB8384AD7</ProviderPhoneAssessmentId>
        <CallEndDate>2013-09-16</CallEndDate>
        <CallEndTime>16:24:00</CallEndTime>
      </PhoneAssessment>
    </PhoneAssessment2>
  </Patient>

所以问题是:

许多元素都在重复。我尝试使用Distinct来限制重复,但这导致了错误:

  

不能将xml数据类型选为DISTINCT,因为它不是   可比性。

1 个答案:

答案 0 :(得分:4)

好的:我注意到的第一件事是你在查询information_schema而不是实际的表,所有这些都是表模式元数据。你能改变你的查询来查询表吗? SELECT ... FROM TN_DataFeed

请参阅此示例:http://technet.microsoft.com/en-us/library/bb510462.aspx

这样的事情可以让你接近你想要的东西:

SELECT ProviderPatientNo,
       LastName,
       FirstName,
       SSN,
       DOB,
       Gender,
       Race,
       PhoneAssessment ....

FROM TN_DataFeed
FOR XML PATH ('Patient');

您可以使用GROUP BY

替换distinct
select 
      ProviderPhoneAssessmentId, CallEndDate, CallEndTime
from 
      TN_DataFeed
group by 
      ProviderPhoneAssessmentId, CallEndDate, CallEndTime