【发布时间】:2021-02-07 21:46:20
【问题描述】:
我刚刚开始学习如何使用 XML 数据格式,而且我已经陷入了更新一些数据的困境。我真的非常感谢您对这个问题的帮助,因为我完全不知道如何处理这样的问题。
生成一些示例数据的代码:
IF OBJECT_iD('tempdb..#beforeXML') is NOT NULL
DROP TABLE #beforeXML
CREATE TABLE #beforeXML
(
ID int NOT NULL,
SomeXMLData XML NOT NULL
)
INSERT INTO #beforeXML (ID, SomeXMLData)
VALUES
(1, '<Parameters><Parameter><Key>ABC</Key><Value>1, 2, 4</Value></Parameter><Parameter><Key>XYZ</Key><Value>A</Value></Parameter></Parameters>'),
(2, '<Parameters><Parameter><Key>KLM</Key><Value>true</Value></Parameter><Parameter><Key>ABC</Key><Value>1, 2, 4, 5</Value></Parameter></Parameters>'),
(3, '<Parameters><Parameter><Key>KLM</Key><Value>false</Value></Parameter><Parameter><Key>ABC</Key><Value>1, 2, 3, 6</Value></Parameter><Parameter><Key>XYZ</Key><Value>A, C</Value></Parameter></Parameters>'),
(4, '<Parameters><Parameter><Key>XYZ</Key><Value>A</Value></Parameter><Parameter><Key>ABC</Key><Value>1, 2, 3, 5</Value></Parameter></Parameters>'),
(5, '<Parameters><Parameter><Key>XYZ</Key><Value>B</Value></Parameter><Parameter><Key>KLM</Key><Value>true</Value></Parameter></Parameters>')
SELECT * FROM #beforeXML
现在最困难的部分来了......
我需要在同一“参数”节点内更新“值”节点的值,其中“键”节点的值 =“ABC”。
如您所见,我的 xml 中有几个“参数”节点,这些节点没有特定的顺序或属性,我可以用来区分它们并确定应该更新哪些节点。有些行没有这样的节点,有些行在“值”节点内已经有数字 3 或/和 5,所以我只需要添加一个或两个(3 或/和 5)不见了。
我想得到的结果:
IF OBJECT_iD('tempdb..#afterXML') IS NOT NULL
DROP TABLE #afterXML
CREATE TABLE #afterXML
(
ID int NOT NULL,
SomeXMLData XML NOT NULL
)
INSERT INTO #afterXML (ID, SomeXMLData)
VALUES
-- added both 3, 5
(1, '<Parameters><Parameter><Key>ABC</Key><Value>1, 2, 3, 4, 5</Value></Parameter><Parameter><Key>XYZ</Key><Value>A</Value></Parameter></Parameters>'),
-- added only 3
(2, '<Parameters><Parameter><Key>KLM</Key><Value>true</Value></Parameter>
<Parameter><Key>ABC</Key><Value>1, 2, 3, 4, 5</Value></Parameter></Parameters>'),
-- added only 5
(3, '<Parameters><Parameter><Key>KLM</Key><Value>false</Value></Parameter><Parameter><Key>ABC</Key><Value>1, 2, 3, 5, 6</Value></Parameter><Parameter><Key>XYZ</Key><Value>A, C</Value></Parameter></Parameters>'),
-- no change
(4, '<Parameters><Parameter><Key>XYZ</Key><Value>A</Value></Parameter><Parameter><Key>ABC</Key><Value>1, 2, 3, 5</Value></Parameter></Parameters>'),
-- no change
(5, '<Parameters><Parameter><Key>XYZ</Key><Value>B</Value></Parameter><Parameter><Key>KLM</Key><Value>true</Value></Parameter></Parameters>')
SELECT * FROM #afterXML
我已经设法从每一行的特定“值”节点中提取值,检查缺少哪些数字并准备更新数据
所以我有temp_table 的数据如下:
IF OBJECT_iD('tempdb..#temp_table') IS NOT NULL
DROP TABLE #temp_table
CREATE TABLE #temp_table
(
ID int NOT NULL,
NewSetOfValues varchar(100) NOT NULL
)
INSERT INTO #temp_table (ID, NewSetOfValues)
VALUES
(1, '1, 2, 3, 4, 5'),
(2, '1, 2, 3, 4, 5'),
(3, '1, 2, 3, 5, 6')
SELECT * FROM #temp_table
但这就是我卡住的地方。
我完全不知道如何构造正确的修改方法语法以仅更新呈现的 xml 结构中的特定“值”节点...:(
是否有一些简单的方法来处理此类更新?
提前感谢您的帮助。
【问题讨论】:
标签: xml tsql xquery sql-server-2017