Seus problemas:
-
Você tenta usar a saída deSelectChild
, 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?
-
Em sua consulta externa, você converte o XML paraVARCHAR(MAX)
(btw:use sempreNVARCHAR
em conexão com XML). Novamente, você forçará o mecanismo a tratar este texto como texto e, portanto, escapará dele.
-
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 otext()
do nó e você obtémNULL
, tudo bem também.
c. Para algumas regras, você deseja marcar o elemento comoNULL
. UseXSINIL
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).