gpt4 book ai didi

sql - 在 SQL Server 中合并 XML

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

假设我的数据库中有以下两段 XML

<!-- XML 1 -->
<pairs>
<item key="a">xml 1 a value</item>
<item key="b">xml 1 b value</item>
<item key="c">xml 1 c value</item>
</pairs>

<!-- XML 2 -->
<pairs>
<item key="c">xml 2 c value</item>
<item key="d">xml 2 d value</item>
<item key="e">xml 1 e value</item>
</pairs>

此数据使用 XML 数据类型存储在两个单独的表中,此外,此 XML 列链接到描述预期 xml 格式的架构,例如

[PairData] [xml](CONTENT [foo].[Pairs]) NULL

在存储过程/函数中,我想将这两个 XML 结构合并为以下内容:

<pairs>
<item key="a">xml 1 a value</item>
<item key="b">xml 1 b value</item>
<item key="c">xml 2 c value</item>
<item key="d">xml 2 d value</item>
<item key="e">xml 2 e value</item>
</pairs>

因此,我们从第一段 xml 中获取了项目:

a, b

我们从第二段 xml 中获取了项目:

c, d, e  

请注意,这两段 XML 有一个共同的项,其键为:

c

在这种情况下,应该在合并的 xml 中使用来自 xml 2 的值(丢弃来自 xml 1 的值)。另一种情况是 XML 1 或 2 可能为 NULL,因此合并过程应该处理这种情况并简单地返回另一个。或者两者都可以为 NULL,在这种情况下返回 NULL。

顺便说一句,在我们当前的实现中,我们从数据库返回 XML 文档并在代码中进行合并。但是,我们更愿意在数据库中完成此合并,因为多个不相关的进程正在调用此过程。

最佳答案

使用:

declare @x1 xml ='<pairs>
<item key="a">xml 1 a value</item>
<item key="b">xml 1 b value</item>
<item key="c">xml 1 c value</item>
</pairs>'

declare @x2 xml ='<pairs>
<item key="c">xml 2 c value</item>
<item key="d">xml 2 d value</item>
<item key="e">xml 2 e value</item>
</pairs>'

select *
from
(
select isnull(t2.a, t1.a) [@key], isnull(t2.b, t1.b) [text()]
from
(
select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b]
from @x1.nodes('/*/item') t(c)
)t1
full join
(
select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b]
from @x2.nodes('/*/item') t(c)
)t2 on t2.a = t1.a
)t
for xml path('item'), root('pairs')

输出:

<pairs>
<item key="a">xml 1 a value</item>
<item key="b">xml 1 b value</item>
<item key="c">xml 2 c value</item>
<item key="d">xml 2 d value</item>
<item key="e">xml 2 e value</item>
</pairs>

更新:

declare @x1 xml ='<pairs>
<item key="a">xml 1 a value</item>
<item key="b">xml 1 b value</item>
<item key="c">xml 1 c value</item>
</pairs>'

declare @x2 xml ='<pairs>
<item key="c">xml 2 c value</item>
<item key="d">xml 2 d value</item>
<item key="e">xml 2 e value</item>
</pairs>'

declare @t1 table(id int, data xml)
insert @t1 values(1, @x1)

declare @t2 table(id int, data xml)
insert @t2 values(1, @x2)

select isnull(t2.a, t1.a) [@key], isnull(t2.b, t1.b) [text()]
from
(
select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b]
from @t1 ta
cross apply ta.data.nodes('/*/item') t(c)
)t1
full join
(
select t.c.value('@key', 'nvarchar(max)') [a], t.c.value('.', 'nvarchar(max)') [b]
from @t2 ta
cross apply ta.data.nodes('/*/item') t(c)
)t2 on t2.a = t1.a
for xml path('item'), root('pairs')

关于sql - 在 SQL Server 中合并 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9228208/

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