Vaše problémy:
-
Pokusíte se použít výstup
SelectChild, který je typu XML, jako obsah atributu@ListDirectChildren. Na tomto místě nelze použít XML, proto se s ním zachází (a escapuje) jako s normálním textem. Pokoušíte se vytvořit druh rekurzivního podřízeného seznamu? -
Ve vnějším dotazu přetypujete XML na
VARCHAR(MAX)(mimochodem:vždy používejteNVARCHARve spojení s XML). Opět donutíte engine, aby s tímto textem zacházel jako s textem, a proto jej opustí. -
Pokusíte se přidat řetězec "null", abyste vyjádřili chybějící hodnotu. Ale XML funguje jinak:a. Prvek v XML chybí úplně:Dotaz na něj vrátí
NULL, to je v pořádku.b. U některých pravidel musí být prvek uveden, ale měl by být prázdný:
<ListDirectChildren></ListDirectChildren>nebo<ListDirectChildren />(což znamená úplně to samé). Dotaz natext()uzlu a dostaneteNULL, to je také v pořádku.C. U některých pravidel chcete označit prvek jako
NULL. PoužijteXSINIL
Zkuste to pro varianty empty a 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
Výsledek:
Content Text
testempty1 "" NULL
testempty2 "" NULL
NotExistingElement NULL NULL
Vyzkoušejte to pro XSINIL
SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL
získat toto
<row xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<test xsi:nil="true" />
</row>
Můj návrh:
Tato otázka
je snad vyřešeno. Začněte prosím novou otázku, kde do vzorového scénáře přidáte další data, aby odrážela více dětí, umístěte odkaz na tuto otázku a uveďte očekávaný výstup (jak by měl XML vypadat).