あなたの問題:
<オール> <リ>
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="http://www.w3.org/2001/XMLSchema-instance">
<test xsi:nil="true" />
</row>
私の提案:
この質問
うまくいけば解決されます。サンプル シナリオにデータを追加して複数の子を反映する新しい質問を開始し、この質問へのリンクを配置して、予想される出力 (XML がどのように見えるか) を述べてください。