我有以下要转换为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,因为它不是 可比性。
答案 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
替换distinctselect
ProviderPhoneAssessmentId, CallEndDate, CallEndTime
from
TN_DataFeed
group by
ProviderPhoneAssessmentId, CallEndDate, CallEndTime