当前位置: 首页 > 面试题库 >

在SQL Server中合并XML

经博延
2023-03-14
问题内容

假设我的数据库中有以下两段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文档,并在代码中进行了合并。但是,我们希望在数据库中完成此合并,因为多个不相关的进程正在调用此proc。


问题答案:

使用:

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')


 类似资料:
  • 问题内容: 这里有些错误,似乎无法合并XML DOMDocumet,这是我收到的错误,“致命错误:在第27行的C:\ xampp \ htdocs \ xmltest\ xmltest.php中调用未定义的方法DOMElement :: importNode()”可以任何人都可以帮助我正确编写此代码… 问题答案: 是属于文档的方法,而不是元素。您要导入 文档 (),然后追加到 元素 ()。 导入时

  • 问题内容: 我有一个带有4列的(example-)数据框: 我现在想将B,C和D列合并/合并到新的E列,如本例所示: 我在这里发现了一个非常类似的问题,但这在A列的末尾添加了合并的列B,C和D: 感谢帮助。 问题答案: 选项1 使用和 选项2 使用分配和 选项3 最近,我喜欢第3个选项。 使用

  • 我有一个表,在列中包含以下值: 表(col1, col2, col3, col4, col5, col6): 因此,我希望有一行: 怎么做?

  • 问题内容: 我有2个文件,并且两个文件的结构相似,我想拥有一个。我尝试了许多解决方案,但只有错误-坦白地说,我不知道这些脚本是如何工作的。 : : 我想用以下结构创建一个新文件 我应该怎么做?你能解释一下方法吗?如何处理更多文件?谢谢 编辑 我尝试了什么? 编辑2 遵循Torious的建议,我查看了DOMDocument手册并找到了一个示例: 但是它创建了错误的xml文件: 而且我无法正确使用此文

  • 问题内容: 如何在JGit中合并? 假设我要与分支合并,该怎么做? 问题答案: 要合并,您可以在之后使用(在org.eclipse.jgit.api包中)。为了给您提供示例,因为Jgit确实缺少示例: 我没有尝试该代码,因此它可能并不完美,但这只是一个开始。而且我没有包括进口。使用JGit开发意味着基于Javadoc的许多尝试

  • 本文向大家介绍在Perl中合并数组,包括了在Perl中合并数组的使用技巧和注意事项,需要的朋友参考一下 由于Perl中的数组只是逗号分隔的值序列,因此可以将它们组合在一起,如下所示- 示例 输出结果 这将产生以下结果- 嵌入式数组仅成为主数组的一部分,如下所示- 示例 输出结果 这将产生以下结果-