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() が値に遭遇したのと同じ順序で値を返す場合。

これら2つの方法のいずれかを信頼して、行の適切な順序に満足できるかどうかを知りたいだけです。

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を使用すると、ordinalでノードを明示的に選択できます。'/root[1]/value[1]'は最初の要素、は2番目の要素などです。また、および'/root[1]/value[2]'を使用することもできます。このようにして、必要な要素を正確に選択できます。要素1、要素2、要素3などを選択すると、順序を制御できます。遅いですが、制御されています。 '(/root/value)[1]''(/root/value[2])'

更新された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 に答える