xml - 如何在 SQL Server 2008 中合并 2 个 XML 变量

标签 xml sql-server-2008 tsql xquery

假设我在 SQL Server 2008 中有 2 个具有以下 XML 的 XML 变量

DECLARE @FIRST XML = '<DBPerson>
                          <firstname>John</firstname>
                          <lastname>Bob</lastname>
                      </DBPerson>',
        @Second XML = '<FromUI>
                           <lastname>New Bob</lastname>
                           <age>39</age>
                       </FromUI>';

我想要以下输出:

<DBPerson>
     <firstname>John</firstname>
     <lastname>New Bob</lastname>
     <age>39</age>
</DBPerson>

基本上我想将 2 个 XML 变量的内容合并到一个变量 @Second 应该优先的地方(如果一个节点同时存在于 @First @Second,应该考虑@Second里面的节点。

我采用的方法是首先获取两个根元素中所有唯一元素的列表,如下所示:

WITH ALLFields AS
(
    SELECT 
          x.y.value('local-name(.)','varchar(50)') As Element   
    FROM @Second.nodes('FromUI/*') AS x(y)
    UNION
    SELECT 
          x.y.value('local-name(.)','varchar(50)') As Element   
    FROM @FIRST.nodes('DBPerson/*') AS x(y)
)
SELECT * FROM ALLFields AF

但我不知道如何从这里开始。我知道我必须先在某处使用 sql:column 来构建一个表,以获取节点名称及其值(基于 AllFields),然后我可以使用 FOR XML PATH('DBPerson') 形成最终的 xml 但有点不确定 sql:column

的用法

非常感谢任何帮助。

更新: 我将其归结为以下查询:

DECLARE @FIRST XML = '<DBPerson><firstname>John</firstname><lastname>Bob</lastname></DBPerson>',
        @Second XML = '<FromUI><lastname>New Bob</lastname><age>39</age></FromUI>';


WITH ALLFields AS
(
    SELECT 
          x.y.value('local-name(.)','varchar(50)') As Element   
    FROM @Second.nodes('FromUI/*') AS x(y)
    UNION
    SELECT 
          x.y.value('local-name(.)','varchar(50)') As Element   
    FROM @FIRST.nodes('DBPerson/*') AS x(y)
), Filtered AS
(
    SELECT 
          Element
        , @FIRST.value('(DBPerson/*[local-name()=sql:column("Element")])[1]','varchar(max)') AS F
        , @Second.value('(FromUI/*[local-name()=sql:column("Element")])[1]','varchar(max)') AS S
    FROM ALLFields AF
), FinalValues AS
(
    SELECT
        Element 
        , CASE 
                WHEN S IS NULL THEN F
                ELSE S
            END AS V
    FROM Filtered
)
SELECT * FROM FinalValues

此查询为我提供了一个表,其中一列中包含所有元素,另一列中包含元素的数据。现在我如何像这样生成我的最终 XML:

<DBPerson><firstname>John</firstname><lastname>New Bob</lastname><age>39</age></DBPerson>

最佳答案

select isnull(S.N.query('.'),F.N.query('.')) as '*'
from @First.nodes('/DBPerson/*') as F(N)
  full outer join @Second.nodes('/FromUI/*') as S(N)
    on F.N.value('local-name(.)', 'nvarchar(100)') = S.N.value('local-name(.)', 'nvarchar(100)')
for xml path(''), root('DBPerson')

关于xml - 如何在 SQL Server 2008 中合并 2 个 XML 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11124437/

相关文章:

json - 对 JSON 数据使用 MERGE 命令

sql-server - nvarchar 类型的不区分大小写的主键,其中 ß != ss

android - 找不到与给定名称匹配的资源?

sql - 在 SQL Server 的查询中插入数据

c# - 使用 C# 读取大型 XML 文件

SQL Server 数据库设计与外键混淆

sql-server-2008 - 如何查找调用给定存储过程的所有 SQL 代理作业

sql-server-2008 - 用于替换字符串中某些变量的存储过程

JavaScript 图像背景

android - android布局中的错误定位