2013-12-16 5 views
7

SQL ServerクエリからXMLファイルを生成しています。SQL Server:FOR属性によるXMLソート制御

私は要素の問題のソートに関するいくつかの問題があります。

たとえば、以下のような単純なコードがあります。あなたが見ることができるように

<test> 
    <tree abc="123"/> 
    <tree abc="789"/> 
    <tree-order abc="456"/> 
</test> 

は、木と木の順序が異なる要素であり、私はこのような

<test> 
    <tree abc="123"/> 
    <tree-order abc="456"/> 
    <tree abc="789"/> 
</test> 

などの属性によってソートしたいです。

誰でもこの問題を解決する良いアイデアはありますか?

ありがとうございます。

的には

<Main> 

<test> 
    <tree abc="123"/> 
    <tree abc="789"/> 
    <tree-order abc="456"/> 
</test> 

<test> 
    <tree abc="123"/> 
    <tree abc="789"/> 
    <tree-order abc="456"/> 
</test> 

</Main> 

であるように私は

以下のように詳細な質問があります申し訳ありません:

<Main> 

<test> 
    <tree abc="123"/> 
    <tree abc="456"/> 
    <tree-order abc="789/> 
</test> 

<test> 
    <tree abc="123"/> 
    <tree abc="456"/> 
    <tree-order abc="789/> 
</test> 

</Main> 

ありがとうございました。

答えて

8

既存のXMLの順序を変更したい場合は、XQueryを使用することができます。

declare @data xml = ' 
<test> 
    <tree abc="123"/> 
    <tree abc="789"/> 
    <tree-order abc="456"/> 
</test> 
' 

select @data.query('<test>{for $i in test/* order by $i/@abc return $i}</test>') 

結果:

<test> 
    <tree abc="123" /> 
    <tree-order abc="456" /> 
    <tree abc="789" /> 
</test> 

sql fiddle demo

更新: を使用し、2

属性の整数値で注文するには

select @data.query(' 
    element Main { 
     for $j in Main/test 
      return element test { 
       for $i in $j/* order by $i/@abc return $i 
      } 
    } 
') 

sql fiddle demo

更新: は、あなたがこのようにXQueryを使用することができ、複数のノードの順序を変更するには:

select @data.query(' 
    element Main { 
     for $j in Main/test 
      return element test { 
       for $i in $j/* order by $i/@abc cast as xs:integer? 
        return $i 
      } 
    } 
') 

sql fiddle demo

+1

私は質問に詳細を追加しましたありがとうございました! –

関連する問題