1

SQLServer2005にXML列があります。

<treatmentDetails>
      <treatmentFactor>
        <treatmentFactorName>Varieties</treatmentFactorName>
        <plot>Whole</plot>
        <levels>
          <level>Var1</level>
          <level>Var2</level>
        </levels>
      </treatmentFactor>
      <treatmentFactor>
        <treatmentFactorName>Nitrogen</treatmentFactorName>
        <plot>Whole</plot>
        <levels>
          <level>N1</level>
          <level>N2</level>
          <level>N3</level> 
        </levels>
      </treatmentFactor>
</treatmentDetails>

これから、次のような出力を作成したいと思いました。

Varieties Nitrogen    
Var1      N1         
var1      N2
var1      N3
var2      N1
var2      N2
var3      N3

xmlfield.queryまたはを試してみまし.valueたが、単一の値(Var1など)またはXMLタグを抽出できます<level>Var1</level>...どんなヘルプでも大いに役立ちます。

4

2 に答える 2

0

これを試して:

DECLARE @Test TABLE (ID INT NOT NULL, XmlContent XML)

INSERT INTO @TEST VALUES(1, '<treatmentDetails>
      <treatmentFactor>
        <treatmentFactorName>Varieties</treatmentFactorName>
        <plot>Whole</plot>
        <levels>
          <level>Var1</level>
          <level>Var2</level>
        </levels>
      </treatmentFactor>
      <treatmentFactor>
        <treatmentFactorName>Nitrogen</treatmentFactorName>
        <plot>Whole</plot>
        <levels>
          <level>N1</level>
          <level>N2</level>
          <level>N3</level> 
        </levels>
      </treatmentFactor>
</treatmentDetails>')

SELECT
    Varieties = TDLevel.value('(.)[1]', 'varchar(20)'),
    Nitrogen = TDLevel2.value('(.)[1]', 'varchar(20)')
FROM
    @test
CROSS APPLY
    XmlContent.nodes('/treatmentDetails/treatmentFactor[1]/levels/level') AS Tbl(TDLevel)
CROSS APPLY
    XmlContent.nodes('/treatmentDetails/treatmentFactor[2]/levels/level') AS Tbl2(TDLevel2)

これにより、探しているもののような出力が得られます。

<treatmentFactor>ただし、常に2つのノードがあるかどうかはわかりません<treatmentDetails>。最初と2番目のサブノードを選択しているだけです。データによっては、これを少し調整する必要がある場合があります。

于 2012-11-26T07:33:00.220 に答える
0

これを試して

select
    TV.V.value('(.)[1]', 'varchar(20)'),
    TN.N.value('(.)[1]', 'varchar(20)')
from table1 as A
    outer apply Data.nodes('/treatmentDetails/treatmentFactor[treatmentFactorName = "Varieties"]/levels/level') as TV(V)
    outer apply Data.nodes('/treatmentDetails/treatmentFactor[treatmentFactorName = "Nitrogen"]/levels/level') as TN(N)

sql fiddle demo

于 2012-11-26T07:39:53.683 に答える