1

我有一个带有 XML 列的表,其中一些元素是可选的。在这个(非常)简化的示例中,代码在所有元素都存在时有效,但如果一个或多个不存在,我什么也得不到。(即零行而不是 1,其中 Y 为空)

我通过各种搜索获得了这种技术,所以肯定有更好的方法。最终,我希望这是一个观点(如果这对方法很重要),但我应该能够弄清楚这一点。

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 次选择,然后返回所有变量 - 但这看起来很笨重,我不确定如何使用这种方法进行查看。

感谢:D

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 回答