Twoje problemy:
-
Próbujesz użyć wyjścia
SelectChild
, który jest typu XML, jako treść atrybutu@ListDirectChildren
. W tym miejscu nie można używać XML, dlatego jest on traktowany (i zmieniany) jak zwykły tekst. Czy próbujesz utworzyć rodzaj rekurencyjnej listy podrzędnej? -
W swoim zewnętrznym zapytaniu rzutujesz XML na
VARCHAR(MAX)
(btw:używaj zawszeNVARCHAR
w połączeniu z XML). Znowu zmusisz silnik do traktowania tego tekstu jako tekstu, a tym samym do jego ucieczki. -
Próbujesz dodać ciąg „null”, aby wyrazić brak wartości. Ale XML działa inaczej:a. Elementu całkowicie brakuje w XML:zapytanie zwróci
NULL
, w porządku.b. W przypadku niektórych reguł element musi tam być, ale powinien być pusty:
<ListDirectChildren></ListDirectChildren>
lub<ListDirectChildren />
(co oznacza dokładnie to samo). Zapytajtext()
węzła i otrzymujeszNULL
, to też jest w porządku.c. W przypadku niektórych reguł chcesz oznaczyć element jako
NULL
. UżyjXSINIL
Wypróbuj to dla odmian empty
i 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
Wynik:
Content Text
testempty1 "" NULL
testempty2 "" NULL
NotExistingElement NULL NULL
Wypróbuj dla XSINIL
SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL
aby to zdobyć
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<test xsi:nil="true" />
</row>
Moja sugestia:
To pytanie
miejmy nadzieję, że rozwiązany. Rozpocznij nowe pytanie, w którym dodasz więcej danych do przykładowego scenariusza, aby odzwierciedlić wiele dzieci, umieść link do tego pytania i określ oczekiwany wynik (jak powinien wyglądać XML).