我有一个数据库,其中包含一个带有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。
我有办法做到吗?
由于
答案 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)
似乎关键是交叉应用关键字