在我的SQL Server数据库中,我有一个带有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>
重复条目的所有行的出现位置。例如,上面我们有John&#39;在XML中两次。
我可以使用exist
XML语句查找1个匹配项,但如何查找它是否超过1?感谢。
答案 0 :(得分:1)
要识别XML中具有重复<Name>
值的任何表格行,您也可以使用exist
:
exist('//Name[. = preceding::Name]')
要分别识别哪些名称是重复的,您需要nodes
和CROSS 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 :(得分: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
来获取多次出现的值。