2016-12-19 12 views
0

のは、あなたがこのようなXML入力があるとしましょう:XMLクエリの自動インクリメント列を生成する方法は?

<fusionlist> 
    <fusion> 
     <page number="2" sourcedocumentid="5"></page> 
     <page number="3" sourcedocumentid="6"></page> 
    </fusion> 
    <fusion> 
     <page number="1" sourcedocumentid="5"></page> 
    </fusion> 
</fusionlist> 

あなたが見ることができるように、融合には一意の識別子を持っていない値のグループであり、それは(それが難しい古典的なSQLでそれを管理することができ生成するための最良の選択肢だろう何

FusionTable 
FusionGroupId | PageNumber | SourceDocumentId 
1    2   5 
1    3   6  
2    1   5 

:ので、あなたの出力は次のようになり、

のは、あなたがこれらのグループを反復処理したいとしましょうそして、あなたは(TSQLでの)SQL表に値を抽出しますFusionGroupId列?

答えて

0

まず、自動生成列を計算するグループをクエリします。この場合、'fusionlist/fusion'となります。

ROW_NUMBER()OVER(ORDER BY n.d)を選択して現在のノードをクエリ( '。')で使用できるようにします。

その後、標準.value()コールを使用して、目的のデータを抽出することができます。

SELECT 
    t.RowNumber, 
    fusion.value('(@sourcedocumentid)[1]','bigint') AS SourceDocumentId, 
    fusion.value('(@number)[1]','tinyint') AS PageNumber 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER(ORDER BY n.d) AS RowNumber, 
     n.d.query('.') query 
    FROM 
    @FusionSourceXml.nodes('fusionlist/fusion') n(d) 
)t 
    CROSS APPLY 
     t.query.nodes('fusion/page') AS x(fusion) 

は生成します:

1 5 2 
1 6 3 
2 5 1 
関連する問題