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

这正确地使用这种类型的分类获取了我的表中的所有行(没有该元素的同一个表中会有其他结果),但是对于每个表记录,这些类别都组合成一列:

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

我包括了 Id 列,所以很容易看到数据来自哪里,主要问题是我只能让它连接每一行的值 - 我需要每个数据元素都有自己的行,然后也许对结果做一个 Select Distinct 。

有没有办法我可以做到这一点?

谢谢

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 回答