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žívejteNVARCHAR
ve 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="http://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).