我有这两个XML,它们存储在2个表中。
问题XML
<Question>
<Choice ID="1">
<Value>Choice A</Value>
</Choice>
<Choice ID="2">
<Value>Choice B</Value>
</Choice>
<Choice ID="3">
<Value>Choice C</Value>
</Choice>
<Choice ID="4">
<Value>Choice D</Value>
</Choice>
<Choice ID="5">
<Value>Choice E</Value>
</Choice>
</Question>
响应XML
<Response>
<Question>
<Value>Choice B</Value>
<Value>Choice C</Value>
</Question>
</Response>
我需要向Response XML中存在的所有Value元素添加一个名为ID的新属性。新ID属性的值可以在Question XML中找到。
对于实例,如果看到问题XML,则正确的
ID
值为Choice B is 2
和Choice C is 3
所以我需要的最终Response XML应该是这样的
<Response>
<Question>
<Value ID="2">Choice B</Value>
<Value ID="3">Choice C</Value>
</Question>
</Response>
有人可以告诉我该怎么做吗?
最佳答案
在大多数情况下,如果要在XML中修改多个位置,最好的方法是切碎信息并从头开始重新构建XML:
DECLARE @q XML=
N'<Question>
<Choice ID="1">
<Value>Choice A</Value>
</Choice>
<Choice ID="2">
<Value>Choice B</Value>
</Choice>
<Choice ID="3">
<Value>Choice C</Value>
</Choice>
<Choice ID="4">
<Value>Choice D</Value>
</Choice>
<Choice ID="5">
<Value>Choice E</Value>
</Choice>
</Question>';
DECLARE @r XML=
N'<Response>
<Question>
<Value>Choice B</Value>
<Value>Choice C</Value>
</Question>
</Response>';
WITH QuestionCTE AS
(
SELECT c.value('@ID','int') AS qID
,c.value('Value[1]','nvarchar(max)') AS qVal
FROM @q.nodes('Question/Choice') AS A(c)
)
,ResponseCTE AS
(
SELECT r.value('.','nvarchar(max)') AS rVal
FROM @r.nodes('Response/Question/Value') AS A(r)
)
SELECT
(
SELECT q.qID AS [Value/@ID]
,q.qVal AS [Value]
FROM ResponseCTE AS r
LEFT JOIN QuestionCTE AS q ON r.rVal=q.qVal
FOR XML PATH(''),TYPE
)
FOR XML PATH('Question'),ROOT('Response')
关于sql - 使用MS SQL修改XML列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40233343/