Давайте предположим, что у меня есть 2 XML переменные в SQL Server 2008 со следующим XMLКак объединить 2 XML-переменные в SQL Server 2008
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>
В основном я хотите объединить содержимое двух 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
Любая помощь высоко ценится.
UPDATE: Я варил вниз к следующему запросу:
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>
Удивительный .. Ты мужчина – Wiz