0

我正在查询XmlSQL Server 2012 中的列。

将路径移动到.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 个单例来返回所有元素结果,或者该.nodes方法是返回多个元素实例的唯一方法?

谢谢!

,c.value('(*/*/Visitors/Visitor/@Name)[1]', 'NVARCHAR(50)') AS Visitor
,c.value('(*/*/Visitors/Visitor/@Name)[2]', 'NVARCHAR(50)') AS Visitor2
,c.value('(*/*/Visitors/Visitor/@Name)[3]', 'NVARCHAR(50)') AS Visitor3     
,c.value('(*/*/Senders/Sender/@Name)[1]', 'NVARCHAR(50)') As Sender
,c.value('(*/*/Senders/Sender/@Name)[2]', 'NVARCHAR(50)') As Sender2    
,c.value('(*/*/Senders/Sender/@Name)[3]', 'NVARCHAR(50)') As Sender3
4

2 回答 2

2

根据定义,调用.value()将只返回一个值。

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

但是请避免使用.nodes(*)——这只是性能的杀手——你需要在.nodes()调用中对你的 XPath 一样具体

于 2013-05-21T17:05:26.387 回答
1

You can select the elements you want from the nodes of the XML type:

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)
于 2013-12-27T01:30:42.227 回答