2011-04-01 4 views
1

Salut quelqu'un pourrait me fournir quelques indices ou solution pour récupérer des jeux d'enregistrements comme ci-dessousExtrayez sortie Xml de Sql Server 2005

Note: J'ai lu la documentation MSDN, mais je ne mène nulle part, mais la perte de cheveux :(

Juste pour la prise en charge pense avoir 2 tables relié par l'intermédiaire Rid champ

Tableau 1 champs,

Rid,UserName,Hash 

champs Table2

Rid,Phone,City,Email 

table1 et table2 sont connectés via le champ Rid.

Je voudrais avoir une sortie XML à l'aide automatique xml ou xml explicite ou qui jamais opérations xml que vous avez obtenu dans SQL Server Express 2005.

Résultats escomptés:

<UserDetails> 
    <Account> 
     <UserName></UserName> 
     <Hash></Hash> 
    </Account> 
    <Personal> 
     <Phone1></Phone1> 
     <City1></City1> 
     <Phone2></Phone2> 
     <City2></City2> 
    </Personal> 
</UserDetails> 

Les données personnelles peuvent avoir n enregistrements. Mais les détails du compte sont seulement un.

+0

Alors passez-vous un 'Rid' dans une procédure pour obtenir cette sortie pour un seul utilisateur, ou voulez-vous un seul XML pour tous les utilisateurs ?? –

+0

@marc_s J'aimerais que cela fonctionne à la fois. Je passerais en débarrasser pour le dossier unique de retriving. Laissez-le vide au cas où je voulais tout – Deeptechtons

Répondre

1

Vous pouvez essayer cela - ce que je ne peux pas faire est de créer ces « énumérations embarqués »

<Phone1></Phone1> 
<City1></City1> 
<Phone2></Phone2> 
<City2></City2> 

Je ne connais pas de moyen de faire facilement les balises XML numérotés de manière séquentielle ...

Tout ce que je peux faire est la sortie que je vais montrer à la fin:

SELECT 
    t1.UserName AS 'Account/UserName', 
    t1.UserHash AS 'Account/Hash', 
    (SELECT 
     t2.Phone AS 'Phone', 
     t2.City AS 'City' 
    FROM table2 t2 
    WHERE t2.Rid = t1.Rid 
    FOR XML PATH(''), TYPE 
    ) AS 'Personal' 
FROM 
    table1 t1 
FOR XML PATH('UserDetails'), ROOT('Users') 

Cela me donne quelque chose comme une de sortie:

Bien sûr, si vous le souhaitez, vous pouvez ajouter une condition WHERE t1.rid = xxx à votre SELECT externe afin de limiter l'utilisateur et ses détails récupérés.

+1

merci pour le code superbe. Fonctionne comme le charme et fait le travail. Je vais prendre une autre pile pour vérifier si c'est une méthode optimale sur DBStackExchage. Merci – Deeptechtons