2010-03-09 4 views
2

peut me montrer comment générer à partir de ces donnéesQuestion T-SQL: requête à tout le monde XML

------------------------DATA-------------------------- 

Key ParentKey 
5 NULL 
25 5 
33 25 
26 5 
27 5 
34 27 
28 5 
29 5 

à ce résultat XML?

---------------------RESULTS-------------------------- 

    <record key="5" parentkey = ""> 
    <record key="25" parentkey = "5"> 
     <record key="33" parentkey = "25"></record> 
     </record> 
    </record> 
    <record key="25" parentkey = "5"> 
    <record key="26" parentkey = "5"> 
    <record key="27" parentkey = "5"> 
     <record key="34" parentkey = "27"></record> 
     </record> 
    </record> 
    <record key="28" parentkey = "5"> 
    <record key="29" parentkey = "5"> 
    </record> 

Répondre

0
select 1 AS TAG, record AS [key!1!parentkey] from table_keys FOR XML EXPLICIT 

devrait le faire.

+0

Il dit une colonne de données sont manquantes –

+0

pourrait vous développez plus loin sur 'for xml explicit'? – Juvil

+0

ok, il semble que je doive faire une union pour chaque niveau/profondeur que j'ai. J'ai besoin de cela pour être dynamique, la profondeur/niveau est infini – Juvil

2

Vous pouvez construire à peu près n'importe quel XML en utilisant le mode PATH de FOR XML.

Dans ce cas, si vous avez besoin de 2 niveaux:

select 
    [Key] as "@key", 
    '' as "@parentkey", 
    (select 
     [Key] as "@key", 
     [ParentKey] as "@parentkey" 
    from KEY_TABLE t1 
    where [ParentKey] = t.[Key] 
    for xml path('record'), type) 
from KEY_TABLE t 
where [ParentKey] is null 
for xml path ('record') 

pour 3 niveaux, vous devez écrire un plus sous_requête, quelque chose comme:

select 
    [Key] as "@key", 
    '' as "@parentkey", 
    (select 
     [Key] as "@key", 
     [ParentKey] as "@parentkey", 
     (select 
      [Key] as "@key", 
      [ParentKey] as "@parentkey" 
     from KEY_TABLE t2 
     where [ParentKey] = t1.[Key] 
     for xml path('record'), type) 
    from KEY_TABLE t1 
    where [ParentKey] = t.[Key] 
    for xml path('record'), type) 
from KEY_TABLE t 
where [ParentKey] is null 
for xml path ('record') 

devrait le faire.


Le sous-requête peut facilement être refactorisé dans une fonction récursive:

create function SelectChild(@key as int) 
returns xml 
begin 
    return (
     select 
      [Key] as "@key", 
      [ParentKey] as "@parentkey", 
      dbo.SelectChild([Key]) 
     from KEY_TABLE 
     where [ParentKey] = @key 
     for xml path('record'), type 
    ) 
end 

Ensuite, vous pouvez obtenir ce que vous avez besoin avec

select 
    [Key] as "@key", 
    '' as "@parentkey", 
    dbo.SelectChild([Key]) 
from KEY_TABLE 
where [ParentKey] is null 
for xml path ('record') 
+0

merci, mais cela ne va pas fonctionner, bien la table ne se limite pas à trois niveaux et je ne veux pas écrire des sous-requêtes encore et encore cela ne fonctionne pas . – Juvil

+1

Je ne suis pas d'accord. La dernière fonction, récursive, fonctionne parfaitement pour une profondeur d'arbre illimitée. Merci beaucoup! –

Questions connexes