2014-08-30 129 views
0

在我的SQL Server数据库中,我有一个XML列的表。那去它的XML是像下面的示例:在XML列中查找重复值

<Rows> 
     <Row> 
      <Name>John</Name> 
     </Row> 
     <Row> 
      <Name>Debbie</Name> 
     </Row> 
     <Row> 
      <Name>Annie</Name> 
     </Row> 
     <Row> 
      <Name>John</Name> 
     </Row> 
</Rows> 

我有我需要找到XML数据有<Name>重复条目的所有行发生的必要条件。例如,上面我们在XML中有两次'John'。

我可以使用exist XML语句找到1个匹配项,但是如何找到它是否大于1?谢谢。

回答

1

识别任何表行,在其XML有重复<Name>值,你可以使用exist还有:

exist('//Name[. = preceding::Name]') 

要确定名称是重复的,分别则需要nodesCROSS APPLY

SELECT 
    t.id, 
    x.Name.value('.', 'varchar(100)') AS DuplicateName 
FROM 
    MyTable t 
    CROSS APPLY t.MyXmlColumn.nodes('//Name[. = preceding::Name]') AS x(Name) 
WHERE 
    t.MyXmlColumn.exist('//Name[. = preceding::Name]') 
1

试试这个:

;with cte as 
(SELECT tbl.col.value('.[1]', 'varchar(100)') as name 
FROM yourtable 
CROSS APPLY xmlcol.nodes('/Rows/Row/Name') as tbl(col)) 

select name 
from cte 
group by name 
having count(name) > 1 

我们首先使用nodes函数将XML转换为关系数据,然后使用value获取Name节点内的文本。然后,我们将上一步的结果放入CTE中,并使用一个简单的group by来获取具有多个出现的值。

Demo

+0

不错的代码测试网站,我不知道那一个。 – Tomalak 2014-08-30 09:57:52

+1

@Tomalak是的,它支持很多语言,甚至可以自动完成C#。非常便利! – 2014-08-30 10:14:04