SQL Server:如何识别和删除具有特定属性的重复XML数据

时间:2015-05-18 15:17:47

标签: xml sql-server-2008-r2

我有一个XML列,其中包含一些重复的节点(属性)。我想识别并删除它们。

我的XML看起来像这样。

<contact id="1">
  <lname>AA</lname>
  <fname>BB</fname>
</contact>
<contact id="2">
  <lname>CC</lname>
  <fname>DD</fname>
</contact>
**<contact id="2">
  <lname>EE</lname>
  <fname>FF</fname>
</contact>**
<contact id="3">
  <lname />
  <fname />
</contact>

我想删除此节点,其重复属性值为id =“2”。

<contact id="2">
  <lname>EE</lname>
  <fname>FF</fname>
</contact>

请帮忙。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Row_Number分解XML,区分不同的ID,然后重新组合xml。

我的意思是这样的:

Select  t.id    As '@id',
        t.fname As 'fname',
        t.lname As 'lname'
From (
    Select  x.value('@id[1]', 'varchar(30)')    As id,
            x.value('lname[1]', 'varchar(30)')  As lname,
            x.value('fname[1]', 'varchar(30)')  As fname,
            Row_Number() Over (Partition By  x.value('@id[1]', 'varchar(30)') Order By x.value('@id[1]', 'varchar(30)')) As r
    from @x.nodes('/contact') as t(x)
    ) As t
Where t.r = 1
For Xml Path('contact')

我希望它可以帮到你。

答案 1 :(得分:0)

您应该可以通过XML Data Modification Language (XML DML)进行就地修改,特别是delete命令。 XML DML使用XML数据类型的modify() Method以及XQuery表达式。

它应该类似于以下内容:

UPDATE SchemaName.TableName
SET XmlFieldName.modify('delete {XQuery expression}');