2016-07-21 6 views
1

SQL Serverを使用してxml値をテーブルに変換しようとしています。このXML値とSQLクエリからSQLサーバから重複するXMLデータを避ける

<ROOT> 
    <NODE1> 
     <VALUE>NODE1_VALUE1</VALUE> 
    </NODE1> 
    <NODE1> 
     <VALUE>NODE1_VALUE2</VALUE> 
     <NODE2> 
      <VALUE>NODE1_NODE2_VALUE1</VALUE> 
     </NODE2> 
     <NODE2> 
      <VALUE>NODE1_NODE2_VALUE2</VALUE> 
     </NODE2> 
    </NODE1> 
</ROOT> 


SELECT NODE1.C.VALUE('VALUE[1]','VARCHAR(MAX)') NODE1_VALUE 
    ,NODE2.C.VALUE('VALUE[1]','VARCHAR(MAX)') NODE2_VALUE 
FROM TABLENAME T 
CROSS APPLY T.TEXT.NODES('/ROOT/NODE1') NODE1(C) 
CROSS APPLY T.TEXT.NODES('/ROOT/NODE1/NODE2') NODE2(C) 

私はこの結果を取得しています、しかし、NODE1_NODE2_VALUE1はNODE1_VALUE1の子ではありません。

NODE1_VALUE  NODE2_VALUE 
================================== 
NODE1_VALUE1 NODE1_NODE2_VALUE1 
NODE1_VALUE1 NODE1_NODE2_VALUE2 
NODE1_VALUE2 NODE1_NODE2_VALUE1 
NODE1_VALUE2 NODE1_NODE2_VALUE2 

しかし、次の結果が必要です。この結果を得るためにSQLクエリを変更するにはどうすればよいですか?

NODE1_VALUE  NODE2_VALUE 
================================== 
NODE1_VALUE1 NULL 
NODE1_VALUE2 NODE1_NODE2_VALUE1 
NODE1_VALUE2 NODE1_NODE2_VALUE2 

(OR) 

NODE1_VALUE  NODE2_VALUE 
================================== 
NODE1_VALUE2 NODE1_NODE2_VALUE1 
NODE1_VALUE2 NODE1_NODE2_VALUE2 
+0

というより相互NODE2(C)のテーブルを適用し、最初のノードに適用外。例えば'TABLENAME T CROSSからT.TEXT.nodes( 'ROOT/NODE1')NODE1(C)OUTERがNODE1.C.nodes( 'NODE2')NODE2(C)'を適用します。注:交差適用は2番目の結果を、外側は最初の結果を適用します。 – ZLK

+0

ZLKありがとうございました。正しく動作しました。また、「ノード」と「値」は小文字にする必要があります。 – Jack

答えて

0
DECLARE @x XML = N' 
<ROOT> 
    <NODE1> 
     <VALUE>NODE1_VALUE1</VALUE> 
    </NODE1> 
    <NODE1> 
     <VALUE>NODE1_VALUE2</VALUE> 
     <NODE2> 
      <VALUE>NODE1_NODE2_VALUE1</VALUE> 
     </NODE2> 
     <NODE2> 
      <VALUE>NODE1_NODE2_VALUE2</VALUE> 
     </NODE2> 
    </NODE1> 
</ROOT>' 

SELECT t.c.value('(VALUE/text())[1]', 'VARCHAR(MAX)') 
    , t2.c2.value('(VALUE/text())[1]', 'VARCHAR(MAX)') 
FROM @x.nodes('//NODE1') t (c) 
OUTER APPLY t.c.nodes('NODE2') t2 (c2) 
関連する問題