从t-sql中的xmls中删除根节点并合并它们

时间:2010-09-27 04:16:50

标签: sql xml tsql

我实际上正在计划从SQL数据库中合并xml数据的最佳方法。

我有一个包含xml数据类型的表。里面是xml的类似模式。我想合并,比方说两个xmls,两端都包含一个<Custom></Custom>根。

这样做的最佳方式是什么?

第一个xml:

<Custom>
  <Data1>
   <ID>23423</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>57568</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>56756</ID>
   <Row1>value</Row1>
  </Data1>
 </Custom>

第二个xml:

<Custom>
  <Data1>
   <ID>6575</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>8345</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>5666</ID>
   <Row1>value</Row1>
  </Data1>
 </Custom>

请不要介意ID,实际数据在GUID中,因此合并不会那么困难。

2 个答案:

答案 0 :(得分:1)

听起来你说我有两个xml数据集具有相同的根节点,但没有其他(可能)共同点?

所以如果你想让一个系统比较它们之间的差异,我会看看.net和开源软件的可用性。这是以前想到的。

合并是一件非常复杂的事情。如果双方都有不同的价值观,你如何决定“合并”谁?它并不像你想象的那么简单。

底线是。你需要更详细地解释你的确切场景以获得真实的反应,但缺乏这一点,我建议你定义你想要做什么...合并用户干预/没有/有时/更明确的问题描述,你会得到更好的结果。

答案 1 :(得分:0)

以下是关于我如何做的事情:

DECLARE @First XML
SET @First = '<Custom>
  <Data1>
   <ID>23423</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>57568</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>56756</ID>
   <Row1>value</Row1>
  </Data1>
 </Custom>'

 DECLARE @Second XML
SET @Second = '<Custom>
  <Data1>
   <ID>6575</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>8345</ID>
   <Row1>value</Row1>
  </Data1>
  <Data1>
   <ID>5666</ID>
   <Row1>value</Row1>
  </Data1>
 </Custom>'

SET @First = (SELECT @First.query('/Custom/*'))
SET @Second = (SELECT @Second.query('/Custom/*'))

DECLARE @Merged XML
SET @Merged = (SELECT @First, @Second FOR XML RAW ('Custom'), ELEMENTS)

SELECT @Merged