nodes()或openxml是否以与在xml中找到的顺序相同的顺序返回行?

时间:2012-08-21 20:45:51

标签: sql sql-server sql-server-2008 openxml

我有一个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窗口中键入代码。

2 个答案:

答案 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

此错误的存在让我担心订单可能有时会被破坏......