sql >> Database >  >> RDS >> Sqlserver

SQL Server 2012:hiërarchische XML-gegevens - escapetekens

Uw problemen:

  1. U probeert de uitvoer van SelectChild . te gebruiken , van het type XML, als de inhoud van het attribuut @ListDirectChildren . U kunt XML op deze plaats niet gebruiken, daarom wordt het behandeld (en escaped) als normale tekst. Probeer je een soort recursieve onderliggende lijst te maken?

  2. In je buitenste query cast je de XML naar VARCHAR(MAX) (btw:gebruik altijd NVARCHAR in combinatie met XML). Nogmaals, je dwingt de engine om deze tekst als tekst te behandelen en er dus aan te ontsnappen.

  3. U probeert de tekenreeks "null" toe te voegen om het ontbreken van een waarde uit te drukken. Maar XML werkt anders:a. Het element ontbreekt volledig in de XML:Als u het opvraagt, wordt NULL . geretourneerd , dat is prima.

    b. Voor sommige regels moet het Element aanwezig zijn, maar moet het leeg zijn:
    <ListDirectChildren></ListDirectChildren> of <ListDirectChildren /> (wat precies hetzelfde betekent). Vraag de text() van het knooppunt op en je krijgt NULL , dat is ook goed.

    c. Voor sommige regels wil je het element markeren als NULL . Gebruik XSINIL

Probeer dit voor variaties van empty en 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

Het resultaat:

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

Probeer dit voor XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

om dit te krijgen

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

Mijn suggestie:

Deze vraag

is hopelijk opgelost. Begin een nieuwe vraag waarin u wat meer gegevens toevoegt aan uw voorbeeldscenario om meerdere kinderen weer te geven, plaats een link naar deze vraag en vermeld de verwachte uitvoer (hoe de XML eruit zou moeten zien).




  1. Datum (jjjj/mm/dd) extraheren uit een tijdstempel in PostgreSQL

  2. Kan binair bestand niet downloaden in PHP

  3. Foutafhandeling beheren tijdens het uitvoeren van sqlplus vanuit shellscripts

  4. MySQL - Snelste manier om te controleren of gegevens in de InnoDB-tabel zijn gewijzigd