带有可选元素的SQl Server T-SQL XML

时间:2012-07-29 16:45:21

标签: sql-server xml tsql

我有一个包含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

1 个答案:

答案 0 :(得分: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)