Xml Shredding .Value Singleton

时间:2013-05-21 16:23:37

标签: sql-server tsql sql-server-2012

我正在查询SQL Server 2012中的Xml列。

将路径移至.value方法时,结果不会返回所有element个实例!

,c.value('(*/*/Visitors/Visitor/@Name)[1]', 'NVARCHAR(50)') AS Visitor
,c.value('(*/*/Senders/Sender/@Name)[1]', 'NVARCHAR(50)') As Sender

我最初使用的是nodes方法,但Wildcard正在扼杀性能

CROSS APPLY c.nodes('*') dd(d) 
OUTER APPLY d.nodes(Visitors/Visitor) As ee(e)
OUTER APPLY d.nodes('Senders/Sender') ff(f)

现在我知道我可以通过类似下面的内容得到正确的结果但是有没有办法通过使用.value方法中的路径返回所有元素结果而不声明3个单例,或者是{ {1}}方法返回多个元素实例的唯一方法?

谢谢!

.nodes

2 个答案:

答案 0 :(得分:2)

.value()的调用只会根据定义返回单个值。

如果您需要枚举节点列表,请使用.nodes() - 这就是它的用途。

但是请避免使用.nodes(*) - 这只是性能的杀手 - 你需要在.nodes()调用

中与XPath一样具体

答案 1 :(得分:1)

您可以从XML类型的节点中选择所需的元素:

declare @x as xml = 
  '<notes>' + 
    '<note>' + 
      '<to>ToP1</to>' +      
      '<Msg>Some Msg</Msg>' +
    '</note>' +
    '<note>' + 
      '<to>ToP2</to>' + 
  '<Msg>Some Msg</Msg>' +
    '</note>' +
  '</notes>';

select  Col1.value('(./to)[1]', 'char(10)' )  from @x.nodes('/notes/note') as x(Col1)