Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2012:dados XML hierárquicos - caracteres de escape

Seus problemas:


  1. Você tenta usar a saída de SelectChild , que é do tipo XML, como o conteúdo do atributo @ListDirectChildren . Você não pode usar XML neste local, portanto, ele é tratado (e escapado) como texto normal. Você está tentando criar um tipo de lista filho recursiva?

  2. Em sua consulta externa, você converte o XML para VARCHAR(MAX) (btw:use sempre NVARCHAR em conexão com XML). Novamente, você forçará o mecanismo a tratar este texto como texto e, portanto, escapará dele.

  3. Você tenta adicionar a string "null" para expressar a falta de um valor. Mas o XML funciona de forma diferente:a. O elemento está completamente ausente no XML:a consulta retornará NULL , isso é bom.

    b. Para algumas regras, o elemento deve estar lá, mas deve estar vazio:
    <ListDirectChildren></ListDirectChildren> ou <ListDirectChildren /> (que significa exatamente o mesmo). Consultar o text() do nó e você obtém NULL , tudo bem também.

    c. Para algumas regras, você deseja marcar o elemento como NULL . Use XSINIL

Tente isso para variações de 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

O resultado:
                   Content  Text
testempty1         ""       NULL
testempty2         ""       NULL
NotExistingElement NULL     NULL

Tente isso para XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

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

Minha sugestão:


Essa questão

espero que seja resolvido. Inicie uma nova pergunta onde você adiciona mais alguns dados ao seu cenário de amostra para refletir vários filhos, coloque um link para esta pergunta e indique a saída esperada (como o XML deve ser).