あなたの問題:
<オール> <リ>
SelectChild の出力を使用しようとしています content としての XML タイプの 。 属性 @ListDirectChildren の .この場所では XML を使用できないため、通常のテキストとして処理 (およびエスケープ) されます。 一種の再帰的な子リストを作成しようとしていますか?
外側のクエリで、XML を VARCHAR(MAX) にキャストします (ところで:常に NVARCHAR を使用してください XML に関連して)。ここでも、エンジンがこのテキストをテキストとして処理するよう強制し、エスケープします。
値が欠落していることを表すために、文字列「null」を追加しようとしています。ただし、XML の動作は異なります。要素が XML に完全にありません:クエリを実行すると NULL が返されます 、それでいいです。
b.一部のルールでは、要素が存在する必要がありますが、空である必要があります:
<ListDirectChildren></ListDirectChildren> または <ListDirectChildren /> (まったく同じ意味です)。ノードの text() を照会します NULL を取得します 、それも結構です。
c.一部のルールでは、要素を NULL としてマークする必要があります . XSINIL を使用する
empty のバリエーションでこれを試してください および 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
結果:
Content Text
testempty1 "" NULL
testempty2 "" NULL
NotExistingElement NULL NULL
XSINIL でこれを試してください
SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL
これを入手する
<row xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
<test xsi:nil="true" />
</row>
私の提案:
この質問
うまくいけば解決されます。サンプル シナリオにデータを追加して複数の子を反映する新しい質問を開始し、この質問へのリンクを配置して、予想される出力 (XML がどのように見えるか) を述べてください。