问题描述
我正在尝试:
- 遍历包含XML [MY_TABLE中的MY_XML_COLUMN]的列 每个XML的
- :
- 获取特定类型([@ type =“ myType”])的所有节点
- 对于每个“ myType”节点:
- 检查它是否包含一个子节点“ myEvent”(注意-如果存在-仅会有一个)
- 如果是这样:
- 将所有值从该节点复制(更新)到另一个具有相同子节点的节点“ myNewEvent” 诸如“ myEvent”之类的节点
- 从所有“ 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>
到目前为止我没有成功的尝试:
-
google +较早的堆栈溢出解决方案
-
代码示例:
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 (将#修改为@)