Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2012 :données XML hiérarchiques - caractères d'échappement

Vos problèmes :

  1. Vous essayez d'utiliser la sortie de SelectChild , qui est de type XML, comme contenu de l'attribut @ListDirectChildren . Vous ne pouvez pas utiliser XML à cet endroit, il est donc traité (et échappé) comme du texte normal. Essayez-vous de créer une sorte de liste enfant récursive ?

  2. Dans votre requête externe, vous convertissez le XML en VARCHAR(MAX) (au fait :utilisez toujours NVARCHAR en relation avec XML). Encore une fois, vous forcerez le moteur à traiter ce texte comme du texte et donc à l'échapper.

  3. Vous essayez d'ajouter la chaîne "null" pour exprimer l'absence d'une valeur. Mais XML fonctionne différemment :a. L'élément est complètement absent du XML :l'interroger renverra NULL , c'est bien.

    b. Pour certaines règles, l'élément doit être là, mais doit être vide :
    <ListDirectChildren></ListDirectChildren> ou <ListDirectChildren /> (ce qui signifie exactement la même chose). Interroger le text() du nœud et vous obtenez NULL , c'est bien aussi.

    c. Pour certaines règles, vous souhaitez marquer l'élément comme NULL . Utiliser XSINIL

Essayez ceci pour les variantes de empty et null :

DECLARE @x XML=
'<root>
   <testempty1 />
   <testempty2></testempty2>
 </root>';

SELECT @x.value('(/root/testempty1)[1]','nvarchar(max)') AS testempty1_Content
      ,@x.value('(/root/testempty1/text())[1]','nvarchar(max)') AS testempty1_Text
      ,@x.value('(/root/testempty2)[1]','nvarchar(max)') AS testempty2_Content
      ,@x.value('(/root/testempty2/text())[1]','nvarchar(max)') AS testempty2_Text
      ,@x.value('(/root/NotExistingElement)[1]','nvarchar(max)') AS NotExistingElement_Content
      ,@x.value('(/root/NotExistingElement/text())[1]','nvarchar(max)') AS NotExistingElement_Text

Le résultat :

                   Content  Text
testempty1         ""       NULL
testempty2         ""       NULL
NotExistingElement NULL     NULL

Essayez ceci pour XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

pour obtenir ceci

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <test xsi:nil="true" />
</row>

Ma suggestion :

Cette question

est j'espère résolu. Veuillez commencer une nouvelle question où vous ajoutez des données supplémentaires à votre exemple de scénario pour refléter plusieurs enfants, placez un lien vers cette question et indiquez le résultat attendu (à quoi le XML devrait ressembler).