使用XQuery访问SQLXML列中的子节点

时间:2011-05-23 17:38:20

标签: xquery sqlxml

我有一个数据库,其中包含一个带有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。

我有办法做到吗?

由于

1 个答案:

答案 0 :(得分: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)  

似乎关键是交叉应用关键字