2011-06-23 3 views
4

Bonjour tous,POUR XML PATH et xsi: nil attributs

J'ai une grande requête utilisant FOR XML PATH pour produire un .xml file.I ont la principale sélection qui représente fondamentalement juste la racine à savoir

select * 
from tbl 
for xml path ('root'),elements xsinil 

je puis sélectionne suivantes imbriquées dans ce principal, sélectionnez-à-dire

select 
    (
     select null [level1], 
       '2' [level2] 
     from tbl 
     for xml path('nested1'),type 
    ), 
    (
     select null [level1], 
       '2' [level2] 
     from tbl 
     for xml path('nested2'),type 
    ) 
for xml path('root'),elements xsinil 

Cependant, l'élément XSINIL l'argument placé sur le chemin pour XML n'a aucun effet sur le contenu subqu C'est-à-dire que l'élément Level1 est juste une étiquette fermée. J'ai besoin de ceci pour montrer comme xsi: nil = "vrai".

Je peux y parvenir en ajoutant des éléments xsinil à l'instruction de chemin for xml, par exemple. Le problème avec ceci est que la déclaration de l'espace de noms est répétée au niveau de la sous-requête.

Je peux trouver beaucoup d'exemples d'utilisation des éléments xsinil mais aucun où il doit s'appliquer à une sous-requête sans une déclaration de namesapce répétée.

Pour confirmer, je suis à la recherche de la sortie suivante:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <nested1> 
    <level1 xsi:nil="true"> 
    <level2>2</level2> 
    </nested1> 
    <nested2> 
    <level1 xsi:nil="true"> 
    <level2>2</level2> 
    </nested2> 
</root> 

Espoir vous pouvez aider!

Répondre

3

Je ne pense pas qu'il soit possible d'empêcher ce comportement avec des sous-requêtes en utilisant for xml path. Il y a un problème similaire signalé ici. https://connect.microsoft.com/SQLServer/feedback/details/265956/suppress-namespace-attributes-in-nested-select-for-xml-statements

Vous pouvez obtenir la sortie souhaitée si vous utilisez for xml explicit à la place.

declare @T table(Level1 int, Level2 int) 
insert into @T values(null, 2) 

select 1 as Tag, 
     null as Parent, 
     null as [root!1], 
     null as [nested1!2!level1!ELEMENTXSINIL], 
     null as [nested1!2!level2!ELEMENTXSINIL], 
     null as [nested2!3!level1!ELEMENTXSINIL], 
     null as [nested2!3!level2!ELEMENTXSINIL] 
union all 
select 2 as Tag, 
     1 as Parent, 
     null, 
     Level1, 
     Level2, 
     null, 
     null 
from @T  
union all 
select 3 as Tag, 
     1 as Parent, 
     null, 
     null, 
     null, 
     Level1, 
     Level2 
from @T  
for xml explicit  

Résultat:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <nested1> 
    <level1 xsi:nil="true" /> 
    <level2>2</level2> 
    </nested1> 
    <nested2> 
    <level1 xsi:nil="true" /> 
    <level2>2</level2> 
    </nested2> 
</root> 
+0

Merci d'avoir pris le temps de répondre. Je pense que vous avez raison de dire qu'il n'est pas possible d'utiliser des sous-requêtes. J'ai, par conséquent, changé la façon dont les requêtes précédentes génèrent les données de sorte que la création du fichier .xml ne nécessite pas de sous-requêtes. Je vais marquer votre réponse aussi correcte que cela fonctionne - mon client veut juste éviter l'utilisation de xml explicite. Merci – JordanMazurke

Questions connexes