gpt4 book ai didi

sql-server - 用降序值替换 SQL Server 中的 XML 元素

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:53 26 4
gpt4 key购买 nike

给定一个包含这些内容的 XML 变量:

<Root>
<Parent>
<ItemID>28</ItemID>
<Child>
<ItemID>28</ItemID>
</Child>
<Child>
<ItemID>28</ItemID>
</Child>
</Parent>
<Parent>
<ItemID>38</ItemID>
<Child>
<ItemID>38</ItemID>
</Child>
</Parent>
</Root>

我需要将每个/Root/Parent/ItemID 值替换为从 -1 开始的递减数字,然后将每个 Child/ItemID 替换为其父 ItemID 元素的值。例如,上面的 XML 应该转换成这样:

<Root>
<Parent>
<ItemID>-1</ItemID>
<Child>
<ItemID>-1</ItemID>
</Child>
<Child>
<ItemID>-1</ItemID>
</Child>
</Parent>
<Parent>
<ItemID>-2</ItemID>
<Child>
<ItemID>-2</ItemID>
</Child>
</Parent>
</Root>

在 C# 中很容易做到,我很难在 SQL Server 中获得正确的语法。不幸的是,我必须这样做才能使用遗留系统。

最佳答案

您的 XML 无效,因此我将其更改为我认为您的意思。

您可以分解 XML,使用 row_number() 计算新的 ItemID 并使用 for xml path 重建它。

declare @XML xml = '
<Root>
<Parent>
<ItemID>28</ItemID>
<Child>
<ItemID>28</ItemID>
</Child>
<Child>
<ItemID>28</ItemID>
</Child>
</Parent>
<Parent>
<ItemID>38</ItemID>
<Child>
<ItemID>38</ItemID>
</Child>
</Parent>
</Root>'

select P.ItemID,
(
select P.ItemID
from P.Child.nodes('Child') as C(N)
for xml path('Child'), type
)
from
(
select -row_number() over(order by P.N) as ItemID,
P.N.query('Child') as Child
from @XML.nodes('/Root/Parent') as P(N)
) as P
for xml path('Parent'), root('Root'), type

关于sql-server - 用降序值替换 SQL Server 中的 XML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17360610/

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