2014-08-30 69 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