Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2012:dati XML gerarchici - caratteri di escape

I tuoi problemi:

  1. Provi a utilizzare l'output di SelectChild , che è di tipo XML, come contenuto dell'attributo @ListDirectChildren . Non è possibile utilizzare XML in questa posizione, quindi viene gestito (e sottoposto a escape) come testo normale. Stai tentando di creare una specie di elenco figlio ricorsivo?

  2. Nella tua query esterna trasmetti l'XML a VARCHAR(MAX) (a proposito:usa sempre NVARCHAR in relazione a XML). Ancora una volta forzerai il motore a trattare questo testo come testo e quindi a eseguirne l'escape.

  3. Si tenta di aggiungere la stringa "null" per esprimere la mancanza di un valore. Ma XML funziona in modo diverso:a. L'elemento manca completamente nell'XML:interrogandolo si restituirà NULL , va bene.

    b. Per alcune regole l'Elemento deve essere presente, ma deve essere vuoto:
    <ListDirectChildren></ListDirectChildren> o <ListDirectChildren /> (che significa esattamente lo stesso). Interroga il text() del nodo e ottieni NULL , va bene anche questo.

    c. Per alcune regole vuoi contrassegnare l'elemento come NULL . Usa XSINIL

Prova per varianti di empty e 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

Il risultato:

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

Prova questo per XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

per ottenere questo

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

Il mio suggerimento:

Questa domanda

si spera risolto. Inizia una nuova domanda in cui aggiungi altri dati al tuo scenario di esempio per riflettere più bambini, inserisci un collegamento a questa domanda e indica l'output previsto (come dovrebbe apparire l'XML).