6

我有一个需要使用openxml 或nodes() 解析的xml。xml 包含几个以不同值重复的子标签,如下所示。

<root>
    <value>10</value>
    <value>12</value>
    <value>11</value>
    <value>1</value>
    <value>15</value>
<root>

对于我的代码,让所有这些行以与 xml 中相同的顺序返回是非常重要的。我用谷歌搜索和搜索,但没有告诉我@mp:id 是否总是以与 xml 中相同的顺序返回。或者,如果 nodes() 以与遇到它们相同的顺序返回值。

我只想知道我是否可以信任这两种方法中的任何一种并对正确的行顺序感到满意。

PS 请原谅以上文本中的任何错误或错误,我也不喜欢在 android 窗口中输入代码。

4

2 回答 2

3

您可以row_number像这样在粉碎的 XML 上使用。

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

使用 DENSE_RANK 唯一标识 XML 节点

更新:

您也可以使用这样的数字表;

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
于 2012-08-21T21:32:06.670 回答
0

XPath 允许您通过序数显式选择节点:'/root[1]/value[1]'是第一个元素,'/root[1]/value[2]'是第二个元素等。也可以使用'(/root/value)[1]'and '(/root/value[2])'。这样您就可以准确地选择您想要的元素,然后选择元素 1 然后选择元素 2 然后选择元素 3 等将为您提供受控顺序。缓慢,但受到控制。

更新PS 这不是很好吗?

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

而这个错误的存在让我担心有时会破坏秩序……

于 2012-08-21T21:22:13.913 回答