2011-01-31 9 views
4

私はこの形式でXMLを持ってTSQL - TSQL/XMLクエリを使用してXMLクエリのヘルプ

<tests> 
    <test> 
     <testid>1</testid> 
     <testval>8</testval> 
     <testname> 
      <testid>1</testid> 
      <testname>test 1</testname> 
     </testname> 
    </test> 
    <test> 
     <testid>2</testid> 
     <testval>5</testval> 
     <testname> 
      <testid>2</testid> 
      <testname>test 2</testname> 
     </testname> 
    </test> 
</tests> 

どのように私はこの結果を達成ん

[Testid][TestVal][TestName] 
    1  8  Test 1 
    2  5  Test 2 
+0

は、テーブルのフィールドまたはファイルのXMLのですか? –

答えて

4

はこれを試してみてください:

declare @input XML = '<tests> 
    <test> 
     <testid>1</testid> 
     <testval>8</testval> 
     <testname> 
      <testid>1</testid> 
      <testname>test 1</testname> 
     </testname> 
    </test> 
    <test> 
     <testid>2</testid> 
     <testval>5</testval> 
     <testname> 
      <testid>2</testid> 
      <testname>test 2</testname> 
     </testname> 
    </test> 
</tests>' 

select 
    Tests.value('(testid)[1]', 'int') as 'TestID', 
    Tests.value('(testval)[1]', 'int') as 'TestVal', 
    Tests.value('(testname/testname)[1]', 'varchar(20)') as 'TestName' 
FROM 
    @input.nodes('/tests/test') as List(Tests) 

これにより、望ましい出力が得られます。

あなたがそれらのXML列のテーブルを持っている場合、あなたは(CROSS APPLYを使用して)わずかに異なるアプローチを使用する必要があります:

select 
    tbl.SomeValue, tbl.SomeOtherValue, 
    Tests.value('(testid)[1]', 'int') as 'TestID', 
    Tests.value('(testval)[1]', 'int') as 'TestVal', 
    Tests.value('(testname/testname)[1]', 'varchar(20)') as 'TestName' 
FROM 
    dbo.YourTable tbl 
CROSS APPLY 
    tbl.XmlColumn.nodes('/tests/test') as List(Tests) 
+0

作品...ありがとう! – Juvil