【问题标题】:Update XML data type without creating duplicate nodes更新 XML 数据类型而不创建重复节点
【发布时间】:2015-05-01 15:51:09
【问题描述】:

在我的应用程序中,用户可以选择要搜索的技能组,这些技能组存储为 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. 如果同一个 XML 中存在 4 和 8,则删除 4,只留下 8
  2. 如果4孤立存在,则将4改为8
  3. 如果 8 单独存在,则不采取任何措施

谁能通过分享解决方案帮助我提高 XML 技能?

【问题讨论】:

  • 你需要一个查询还是多个查询?

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


【解决方案1】:

我可以通过两个更新来做到这一点:

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

如果每个技能元素只允许出现一次&lt;s id="4"/&gt;,并且每次搜索只允许出现一个技能元素并且只允许一个搜索元素:

  1. 如果4单独存在,则将4改为8
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 ')

【讨论】:

  • 可爱,谢谢。您能否参考/ 解释一下这个位的含义data(s/@id)=8]/s[@id=4])?此外,在第二部分中,&lt;s id="4"/&gt;可能存在两次,如果 XML 没有被正确创建(在我们的控制之外),所以我们希望将所有 4 更新为 @ 987654328@
  • skills[data(s/@id)=4 and not(data(s/@id)=8)] 表示至少有一个属性值为 4 且没有任何属性值为 8 的元素的过滤技能。如果存在多个&lt;s id="4" /&gt;,则应使用@987654331 @为了删除多余的外观,因为replace不能一次替换多个节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2018-03-10
  • 1970-01-01
  • 2016-05-13
  • 2020-01-31
  • 2023-04-02
相关资源
最近更新 更多