将大量子节点复制到现有节点

问题描述

我正在尝试:

  1. 遍历包含XML [MY_TABLE中的MY_XML_COLUMN]的列
  2. 每个XML的
    1. 获取特定类型([@ type =“ myType”])的所有节点
    2. 对于每个“ myType”节点:
      1. 检查它是否包含一个子节点“ myEvent”(注意-如果存在-仅会有一个)
      2. 如果是这样:
        1. 将所有值从该节点复制(更新)到另一个具有相同子节点的节点“ myNewEvent” 诸如“ myEvent”之类的节点
        2. 从所有“ myType”节点中删除“ myEvent”节点,无论如何

示例:

<hubs>
  <hubOne type="myType">   (myNewEvent should b updated as its of "myType" hub and has "myEvent" node)
     <myEvent>
       <subNodeOne> x <subNodeOne>
       <subNodeTwo> y <subNodeTwo>
       <subNodeThree> z <subNodeThree>
     </myEvent>
     <myNewEvent>
       <subNodeOne> a <subNodeOne>
       <subNodeTwo> b <subNodeTwo>
       <subNodeThree> c <subNodeThree>
     </myNewEvent> 
  </hubOne>
  <hubTwo type="NOTmyType"> (myNewEvent should NOT b updated as its NOT of "myType" hub)
     <myEvent>
       <subNodeOne> x <subNodeOne>
       <subNodeTwo> y <subNodeTwo>
       <subNodeThree> z <subNodeThree>
     </myEvent>
     <myNewEvent>
       <subNodeOne> a <subNodeOne>
       <subNodeTwo> b <subNodeTwo>
       <subNodeThree> c <subNodeThree>
     </myNewEvent> 
  </hubTwo>
  <hubThree type="myType"> (myNewEvent should NOT b updated as its of "myType" but no subnode "myEvent")
     <myNewEvent>
       <subNodeOne> x <subNodeOne>
       <subNodeTwo> y <subNodeTwo>
       <subNodeThree> z <subNodeThree>
     </myNewEvent>
  </hubThree>
  <hubFour type="myType"> (myNewEvent should b updated as its of "myType" hub and has "myEvent" node)
     <myEvent>
       <subNodeOne> q <subNodeOne>
       <subNodeTwo> w <subNodeTwo>
       <subNodeThree> e <subNodeThree>
     </myEvent>
     <myNewEvent>
       <subNodeOne> a <subNodeOne>
       <subNodeTwo> b <subNodeTwo>
       <subNodeThree> c <subNodeThree>
     </myNewEvent> 
  </hubFour>
</hubs>

想要的结果:

<hubs>
  <hubOne type="myType"> (myNewEvent updated and myEvent deleted)
     <myNewEvent>
       <subNodeOne> x <subNodeOne>
       <subNodeTwo> y <subNodeTwo>
       <subNodeThree> z <subNodeThree>
     </myNewEvent> 
  </hubOne>
  <hubTwo type="NOTmyType"> (myNewEvent NOT updated and myEvent deleted)
     <myNewEvent>
       <subNodeOne> a <subNodeOne>
       <subNodeTwo> b <subNodeTwo>
       <subNodeThree> c <subNodeThree>
     </myNewEvent> 
  </hubTwo>
  <hubThree type="myType"> (myNewEvent NOT updated)
     <myNewEvent>
       <subNodeOne> x <subNodeOne>
       <subNodeTwo> y <subNodeTwo>
       <subNodeThree> z <subNodeThree>
     </myNewEvent>
  </hubThree>
  <hubFour type="myType"> (myNewEvent updated and myEvent deleted)
     <myNewEvent>
       <subNodeOne> q <subNodeOne>
       <subNodeTwo> w <subNodeTwo>
       <subNodeThree> e <subNodeThree>
     </myNewEvent> 
  </hubFour>
</hubs>

到目前为止我没有成功的尝试:

  1. google +较早的堆栈溢出解决方案

  2. 代码示例:

DECLARE @ID INT;
DECLARE @HUB_ID UNIQUEIDENTIFIER;
DECLARE @NAME VARCHAR(MAX);

DECLARE PROFILES_CURSOR CURSOR
FOR
SELECT P.[ID] FROM [MY_TABLE] P WHERE P.DELETED=0;
OPEN SOME_CURSOR
FETCH NEXT FROM SOME_CURSOR INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE HUBS_CURSOR CURSOR
FOR
SELECT H.hub.value('(@name)','varchar(1024)') AS [NAME]
FROM MY_TABLE
CROSS APPLY MY_XML_COLUMN.nodes('/integration/hub[@type="myType"]') as H(hub)
WHERE PROFILE_ID=@ID
OPEN HUBS_CURSOR
FETCH NEXT FROM HUBS_CURSOR INTO @NAME
WHILE @@FETCH_STATUS = 0
BEGIN

UPDATE [MY_TABLE]
SET [INTEGRATION_XML].modify(some xquery code to deal all nodes at once?)
WHERE ANOTHER_COLUMN = @ID
AND (
SELECT [SOME_IDENTIFYING_COLUMN]
FROM MY_TABLE PS
WHERE PS.MY_XML_COLUMN.exist('/integration/hub[@name=sql:variable("@NAME" and @type="myType")]/events') = 1
AND PS.INTEGRATION_XML.exist('/integration/hub[@name=sql:variable("@NAME" and @type="myType")]/events/myEvent') = 1
AND PROFILE_ID=@ID
) IS NOT NULL
FETCH NEXT FROM HUBS_CURSOR INTO @NAME
END

CLOSE HUBS_CURSOR
DEALLOCATE HUBS_CURSOR
FETCH NEXT FROM PROFILES_CURSOR INTO @ID
END

CLOSE PROFILES_CURSOR
DEALLOCATE PROFILES_CURSOR

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)