0

XML列を持つテーブルを持つデータベースがあります。XMLデータには、次のような子ノードが多数あります。

<test>
  <result id="1234">
    <data elementname="Message">some error message</data>
    <data elementname="Cat">Cat01</data>
    <data elementname="Type">WARNING</data>
  </result>
  <result id="5678">
    <data elementname="Message">some error message</data>
    <data elementname="Cat">Cat01</data>
    <data elementname="Type">WARNING</data>
  </result>
</test>

Cat要素には、さまざまな値を設定できます。このデータに関するレポートを作成しようとしているので、データ全体のすべてのカテゴリのリストを取得したいと思います。これは私の質問です:

Select Id, XmlData.query('/test/result/data[@elementname = ''Cat''] ')  AS  Message
From Table
WHERE XmlData.exist('/test/result/data[@elementname = ''Cat'']') = 1
ORDER BY FriendlyName

これにより、このタイプの分類でテーブル内のすべての行が正しく取得されます(その要素がない同じテーブルには他の結果があります)が、カテゴリはすべて、テーブルレコードごとに1つの列に結合されます。

Id1, <data elementname="Cat">Cat01</data><data elementname="Cat">Cat01</data>
Id2, <data elementname="Cat">Cat01</data><data elementname="Cat">Cat01</data>

Id列を含めているので、データがどこから来ているのかを簡単に確認できます。主な問題は、各行の値を連結するためにしか取得できないことです。これらの各データ要素には独自の行が必要です。次に、結果に対してSelectDistinctを実行します。

それができる方法はありますか?

ありがとう

4

1 に答える 1

1

質問を投稿した後は、常に Google ....

ここで答えを見つけたと思います: http://blogs.msdn.com/b/simonince/archive/2009/04/24/flattening-xml-data-in-sql-server.aspx

SELECT  DISTINCT  cref.value('(text())[1]', 'varchar(50)') as Cat
FROM   
      SGIS CROSS APPLY 
      Data.nodes('/test/result') AS Results(rref) CROSS APPLY
      rref.nodes('data[@elementname = ''Cat'']') AS Categories(cref)  

クロスアプライのキーワードがポイントのようです

于 2011-05-24T08:59:51.717 に答える