假设我在 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>