Comment get des résultats dans un format XML spécifique à partir d'une requête TSQL?

J'ai la requête T-SQL suivante que je veux convertir en file XML. J'essayais d'utiliser FOR XML Path, mais cela ne fonctionne pas comme j'en ai besoin. Voici ma définition de la table 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) ) 

Mes données correspondent à ce format ci-dessus et sont insérées avec succès. Mais j'ai besoin de mon XML pour ressembler à:

 <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> 

C'est mon code XML Path pour récupérer la requête T-SQL ci-dessus:

 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 

Notez que je n'ai pas encore inclus toutes les colonnes. Au lieu de cela, j'essaie juste de faire fonctionner la section Patient. Notez comment dans l'exemple file XML ci-dessous, la section qui montre comment Patient est le nœud parent de ProviderPatientNo, Nom, Prénom, SSN, DOB, Sexe, Race et Ethnicity.

Mais à la place, ma sortie XML de mon XML Path ci-dessus est:

 <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> 

Donc les problèmes sont:

Beaucoup d'éléments sont répétés. J'ai essayé d'utiliser Distinct pour limiter les répétitions, mais cela a causé l'erreur:

Le type de données xml ne peut pas être sélectionné comme DISTINCT car il n'est pas comparable.

Ok: La première chose que je remarque est que vous interrogez l'information_schema pas la table réelle , et tout ce que vous donnez est la méta-donnée du schéma de la table. Pouvez-vous changer votre requête pour interroger la table s'il vous plaît? SELECT ... FROM TN_DataFeed .

Voir cet exemple: http://technet.microsoft.com/en-us/library/bb510462.aspx

Quelque chose comme ça devrait vous rapprocher de ce que vous voulez:

 SELECT ProviderPatientNo, LastName, FirstName, SSN, DOB, Gender, Race, PhoneAssessment .... FROM TN_DataFeed FOR XML PATH ('Patient'); 

vous pouvez replace le distinct avec un GROUP BY

 select ProviderPhoneAssessmentId, CallEndDate, CallEndTime from TN_DataFeed group by ProviderPhoneAssessmentId, CallEndDate, CallEndTime