【问题标题】:How to get results in a specific XML format from a TSQL query?如何从 TSQL 查询中获取特定 XML 格式的结果?
【发布时间】:2013-11-21 20:51:18
【问题描述】:

我有以下要转换为 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 路径代码:

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 路径的 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,因为它不是 可比。

【问题讨论】:

  • 您要求的 XML 和表很难阅读。您能否以一种更简单且容易对应于您稍后显示的问题的输出的方式进行格式化?我们知道在实际案例中您会有更多的列,但对于这个问题,一个简单的例子可能会更好。
  • Preet,你能再检查一下吗?我现在更新了我的描述。
  • 好的:我注意到的第一件事是您查询的是 information_schema 而不是实际的表,所有这些都为您提供了表模式元数据。你能改变你的查询来查询表格吗? SELECT ... FROM TN_DataFeed,然后更改您的问题以反映该查询和该输出。看这个例子:technet.microsoft.com/en-us/library/bb510462.aspx

标签: sql-server xml tsql path


【解决方案1】:

好的:我注意到的第一件事是您查询的是 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

【讨论】:

  • 谢谢,普里特。我取得了很大的进步。你现在可以看看我修改后的描述吗?
  • 我的最后一个问题是如何消除根元素?比如我想去掉上面的PhoneAssessment2标签。
  • 查看此链接是否对您有帮助:social.msdn.microsoft.com/Forums/sqlserver/en-US/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2014-08-31
  • 2010-12-22
  • 2015-07-10
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多