1

一部の要素がオプションである XML の列を含むテーブルがあります。この (非常に) 単純化された例では、すべての要素が存在する場合にコードが機能しますが、1 つ以上の要素が存在しない場合は何も得られません。(つまり、Y が null の 1 行ではなく 0 行)

私はさまざまな検索を通じてこの手法にたどり着いたので、確かにより良いアプローチがあるかもしれません. 最終的には、これをビューにしたいのですが(それがアプローチにとって重要な場合)、それを理解できるはずです。

declare @x XML = '<Root><A x="1"><B ySameName="2"/><C ySameName="3"/></A></Root>';
--declare @x XML = '<Root><A x="1"><C ySameName="3"/></A></Root>';
select EA.*, EB.*, EC.* from
(select c.node.value('@x', 'int') as X 
   from @x.nodes('//Root/A') AS c(node)) EA
,(select c.node.value('@ySameName', 'int') as YB 
   from @x.nodes('//Root/A/B') AS c(node)) EB
,(select c.node.value('@ySameName', 'int') as YC 
   from @x.nodes('//Root/A/C') AS c(node)) EC;

ローカル変数を使用して3つの選択としてこれを実行し、すべての変数を返すことができますが、それはかさばるようで、そのアプローチでどのようにビューを行うかわかりません。

ありがとう

4

1 に答える 1

1

これを試して:

select T.N.value('@x', 'int') as EA,
       T.N.value('B[1]/@ySameName', 'int') as YB,
       T.N.value('C[1]/@ySameName', 'int') as YC
from @x.nodes('/Root/A') as T(N)
于 2012-07-29T18:08:09.543 に答える