我正在查询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
答案 0 :(得分:2)
对.value()
的调用只会根据定义返回单个值。
如果您需要枚举节点列表,请使用.nodes()
- 这就是它的用途。
但是请避免使用.nodes(*)
- 这只是性能的杀手 - 你需要在.nodes()
调用
答案 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)