更新XML数据类型而不创建重复的节点

时间:2015-05-01 15:51:09

标签: sql-server tsql sql-server-2012 sqlxml

在我的应用程序中,用户可以选择要搜索的技能组,这些技能组存储为XML。在这个简单的示例中,我在包含主XML索引的表中具有以下结构。

CREATE TABLE #myTable (ID int IDENTITY(1,1) PRIMARY KEY, userId int NOT NULL, searchXml xml not null);
GO
CREATE PRIMARY XML INDEX [Ix1] ON #myTable (searchXml) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
INSERT INTO #myTable (userId, searchXml) VALUES 
    (1, '<search><skills><s id="4" /><s id="10" /></skills></search>'),
    (1, '<search><skills><s id="4" /><s id="8" /><s id="10" /></skills></search>'),
    (2, '<search><skills><s id="7" /><s id="8" /><s id="10" /></skills></search>'),
    (3, '<search><skills><s id="4" /><s id="10" /><s id="11" /></skills></search>');
SELECT * FROM #myTable;


DROP TABLE #myTable;
GO

我需要执行以下更新,但经过一段冗长的阅读后,无法获得任何结果:

技能ID 4将与技能ID 8合并,仅留下技能ID 8。 因此,每个XML数据都需要以下列方式更新:

  1. 如果4&amp; 8存在于同一XML中,删除4,只留下8个
  2. 如果4单独存在,则将4更改为8
  3. 如果8孤立存在,则不采取任何措施
  4. 任何人都可以通过共享解决方案帮助我提高XML技能吗?

1 个答案:

答案 0 :(得分:1)

我可以通过两次更新来完成:

  
      
  1. 如果4&amp; 8存在于同一XML中,删除4,只留下8个
  2.   
UPDATE #myTable
SET searchXml.modify('
delete (/search/skills[data(s/@id)=4 and data(s/@id)=8]/s[@id=4])')

如果每个技能元素只允许出现一个<s id="4"/>,每个搜索只有一个技能元素,只有一个搜索元素:

  
      
  1. 如果4单独存在,则将4更改为8
  2.   
UPDATE #myTable
SET searchXml.modify('
replace value of 
(/search/skills[data(s/@id)=4 and not(data(s/@id)=8)]/s[@id=4]/@id)[1] 
 with 8 ')