我有一个xml,我需要使用openxml或nodes()进行解析。 xml包含几个以不同值重复的子标记,如下所示。
<root>
<value>10</value>
<value>12</value>
<value>11</value>
<value>1</value>
<value>15</value>
<root>
对于我的代码,非常重要的是我以与xml中相同的顺序返回所有这些行。我用谷歌搜索和gogled但没有告诉我@mp:id是否总是以与xml中相同的顺序返回。或者,如果nodes()以与遇到它们相同的顺序返回值。
我想知道我是否可以信任这两种方法中的任何一种,并对行的正确顺序感到满意。
P.S。原谅上述文本中的任何错误或错误,我不喜欢在Android窗口中键入代码。
答案 0 :(得分:3)
您可以像这样在碎片XML上使用row_number
。
declare @XML xml=
'<root>
<value>10</value>
<value>12</value>
<value>11</value>
<value>1</value>
<value>15</value>
</root>'
select value
from
(
select T.N.value('.', 'int') as value,
row_number() over(order by T.N) as rn
from @xml.nodes('/root/value') as T(N)
) as T
order by T.rn
Uniquely Identifying XML Nodes with DENSE_RANK
更新
您也可以使用这样的数字表格;
declare @XML xml=
'<root>
<value>10</value>
<value>12</value>
<value>11</value>
<value>1</value>
<value>15</value>
</root>';
with N(Number) as
(
select Number
from master..spt_values
where type = 'P'
)
select @XML.value('(/root/value[sql:column("N.Number")])[1]', 'int')
from N
where N.Number between 1 and @XML.value('count(/root/value)', 'int')
order by N.Number
答案 1 :(得分:0)
XPath允许您按顺序显式选择节点:'/root[1]/value[1]'
是第一个元素,'/root[1]/value[2]'
是第二个元素。也可以使用'(/root/value)[1]'
和'(/root/value[2])'
。通过这种方式,您可以精确选择所需的元素,然后选择元素1,然后选择元素2,然后选择元素3等将为您提供受控的顺序。缓慢但受控制。
更新了 P.S.难道这不是真的吗?
declare @x xml = '<root>
<value>10</value>
<value>12</value>
<value>11</value>
<value>1</value>
<value>15</value>
<root>';
select x.value(N'position()', N'int') as position,
x.value(N'.', 'int') as value
from @x.nodes(N'//root/value') t(x)
不幸的是,不是......
Msg 2371, Level 16, State 1, Line 9
XQuery [value()]: 'position()' can only be used within a predicate or XPath selector
此错误的存在让我担心订单可能有时会被破坏......