gpt4 book ai didi

sql - 如何使用SQL Server通过子节点中的值查找所有父节点

转载 作者:行者123 更新时间:2023-12-03 00:37:04 28 4
gpt4 key购买 nike

我对 SQL Server 中的 XML 查询不熟悉。我想写一个查询

  1. 在子节点中查找值并删除其父节点
  2. 重新排序子节点中的项目顺序

如下例:我的列的类型是 nvarchar(max) 并存储值:

<Trainings>
<Training>
<Id>10</Id>
<Data>test1</Data>
<ItemOrder>1</ItemOrder>
</Training>
<Training>
<Id>12</Id>
<Data>test12</Data>
<ItemOrder>2</ItemOrder>
</Training>
<Training>
<Id>101</Id>
<Data>test111</Data>
<ItemOrder>3</ItemOrder>
</Training>
<Training>
<Id>102</Id>
<Data>test122</Data>
<ItemOrder>4</ItemOrder>
</Training>
</Trainings>

预期结果必须是:

<Trainings>
<Training>
<Id>10</Id>
<Data>test1</Data>
<ItemOrder>1</ItemOrder>
</Training>
<Training>
<Id>101</Id>
<Data>test111</Data>
<ItemOrder>2</ItemOrder>
</Training>
<Training>
<Id>102</Id>
<Data>test122</Data>
<ItemOrder>3</ItemOrder>
</Training>
</Trainings>

我已尝试使用如下查询,但如何在 Data 子项中找到带有 test12Training 节点号?然后对所有 Training 节点的所有 ItemOrder 重新排序。

CREATE TABLE Resume ([Training] nvarchar(max));

INSERT INTO Resume ([Training])
VALUES ('<Trainings><Training><Id>10</Id><Data>test1</Data><ItemOrder>1</ItemOrder></Training><Training><Id>12</Id><Data>test12</Data><ItemOrder>2</ItemOrder></Training><Training><Id>101</Id><Data>test111</Data><ItemOrder>3</ItemOrder></Training><Training><Id>102</Id><Data>test122</Data><ItemOrder>4</ItemOrder></Training></Trainings>');

DECLARE @string NVARCHAR(MAX)

SELECT @string = [Training]
FROM Resume

DECLARE @xml XML

SET @xml = CONVERT(XML, @string)
SET @xml.modify('delete (/Trainings/Training)[2]')
SET @string = CONVERT(NVARCHAR(MAX), @xml)

SELECT @string

这是Fiddle链接:http://sqlfiddle.com/#!6/894a0/3

最佳答案

只需将 XPath 与您搜索的谓词一起使用

set @xml.modify('delete (/Trainings/Training[./Data = "test12"])')

更新:为了解决第二个问题,我建议使用完全不同的 XML 关系方法:

SELECT c.value('(./Id/node())[1]','int') AS Id,
c.value('(./Data/node())[1]','nvarchar(max)') AS Data,
row_number() over (order by c.value('(./Id/node())[1]','int')) as ItemOrder
FROM @xml.nodes('/Trainings/Training') AS A(c)
WHERE c.value('(./Data/node())[1]','nvarchar(max)') != 'test12'
FOR XML PATH('Training'),ROOT('Trainings'),TYPE

demo

关于sql - 如何使用SQL Server通过子节点中的值查找所有父节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267180/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com