sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2012:Hierarkisk XML-data - escape-tecken

Dina problem:

  1. Du försöker använda utdata från SelectChild , som är av typen XML, som innehåll av attributet @ListDirectChildren . Du kan inte använda XML på denna plats, därför hanteras den (och escaped) som normal text. Försöker du skapa en typ av rekursiv underordnad lista?

  2. I din yttre fråga castar du XML till VARCHAR(MAX) (btw:använd alltid NVARCHAR i samband med XML). Återigen kommer du att tvinga motorn att behandla denna text som text och därför undkomma den.

  3. Du försöker lägga till strängen "null" för att uttrycka att ett värde saknas. Men XML fungerar annorlunda:a. Elementet saknas helt i XML:en om du frågar det kommer att returnera NULL , det är bra.

    b. För vissa regler måste elementet finnas där, men bör vara tomt:
    <ListDirectChildren></ListDirectChildren> eller <ListDirectChildren /> (vilket betyder exakt samma sak). Fråga nodens text() och du får NULL , det är också bra.

    c. För vissa regler vill du markera elementet som NULL . Använd XSINIL

Prova detta för varianter av empty och 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

Resultatet:

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

Prova detta för XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

för att få det här

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

Mitt förslag:

Den här frågan

är förhoppningsvis löst. Starta en ny fråga där du lägger till lite mer data till ditt exempelscenario för att återspegla flera barn, placera en länk till denna fråga och ange förväntad utdata (hur XML ska se ut).




  1. MySQL &PHP :Sök med flera nyckelord

  2. Hitta kolumnvärdenas anslutning

  3. Ta bort efterföljande nollor i decimalvärdet med ändrad längd

  4. Hur skriver man detta (vänster koppling, underfråga ) i Laravel 5.1?