2010-02-26 19 views
2

Si j'ai une table parent et une table enfant où un seul parent peut exister pour plusieurs enfants, comment puis-je retourner le xml suivant à partir d'une procédure stockée dans un procédure stockée?Renvoyer les données parent et enfant à l'aide de FOR XML dans un processus stocké

<Parents> 
    <Parent> 
     <ID>Integer</ID> 
     <Children> 
      <Child> 
       <ID>Integer</ID> 
       <Text>String</Text> 
      </Child> 
      <Child> 
       <ID>Integer</ID> 
       <Text>String</Text> 
      </Child> 
     </Children> 
    </Parent> 
    <Parent> 
     <ID>Integer</ID> 
     <Children> 
      <Child> 
       <ID>Integer</ID> 
       <Text>String</Text> 
      </Child> 
      <Child> 
       <ID>Integer</ID> 
       <Text>String</Text> 
      </Child> 
     </Children> 
    </Parent> 
</Parents> 
+1

il n'y a aucune chance de mettre à niveau vers SQL Server 2005 ou 2008? Tout ce qui est XML est juste ** beaucoup plus facile ** dans les versions ultérieures ... –

+0

Très honnêtement, dans SQL Server 2000 - je sélectionnais simplement les lignes en C# et manipulais toutes les manipulations XML. XML dans SQL Server 2000 n'est pas amusant du tout, compliqué et compliqué et sujet aux erreurs. Épargnez-vous les tracas! –

Répondre

1

Ceci est certainement beaucoup plus difficile avec SQL 2000. Voici un exemple de requête qui peut vous aider à démarrer avec ce processus. Veuillez comprendre que ce n'est pas exactement dans le format que vous recherchez. Le but de la requête est de vous aider à démarrer ... un coup de pouce dans la bonne direction.

L'astuce ici est d'utiliser FOR XML EXPLICIT, et d'élaborer soigneusement vos alias de colonne pour contrôler le positionnement des éléments.

Declare @Parent Table(Id Int, Data VarChar(20)) 
Insert Into @Parent Values(1, 'Fruit') 
Insert Into @Parent Values(2, 'Vegetable') 

Declare @Child Table(Id Int, ParentId Int, Name VarChar(20)) 
Insert Into @Child Values(1, 1, 'Apple') 
Insert Into @Child Values(2, 1, 'Banana') 
Insert Into @Child Values(3, 2, 'Carrot') 
Insert Into @Child Values(4, 2, 'Pea') 

Select 1 As Tag, 
     NULL As Parent, 
     Id As [Parent!1!Id!Element], 
     Data As [Parent!1!Data!Element], 
     NULL As [Child!2!Id!Element], 
     NULL As [Child!2!Name!Element] 
From @Parent P 

Union 

Select 2 As Tag, 
     1 As Parent, 
     P.Id, 
     NULL, 
     C.Id, 
     Name 
From @Child C 
     Inner Join @Parent P 
      On C.ParentId = P.Id 
Order By [Parent!1!Id!Element] 
For XML Explicit 
2

Vous pouvez le faire en utilisant quelques sélections d'imbrication.

select 'a' as "ID", 
(
select child as "ID" 
from (select 'integer' as child 
    union all 
    select 'string') a 
    for xml path('Child'), type, root('Childrens') 
    ) as "*" 
for xml path('Parent'), type, root('Parents') 

Opps, je n'ai pas vu que c'était pour Sql-Server-2000.

+0

qui aurait été ma solution, aussi - mais ne fonctionne pas sur SQL Server 2000, hélas ..... :-( –

+0

(SQL Server 2000) + (XML) = ouch !; -o –