sql - 使用MS SQL修改XML列

标签 sql xml tsql xpath xquery

我有这两个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 2Choice 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/

相关文章:

mysql - 在MySQL中使用外键从另一个表的列中选择数据

java - 使用 jdbc 从 sql server 获取成功批量插入的行数

xml - 有没有一种方法可以在不使用 firebug 或 xpath 的情况下学习 xpath,因为 firefox 不支持插件?

javascript - 是否可以更改 ExtLib 中应用程序布局控件中设置的预定义 Bootstrap 类

javascript - 获取页面源码

sql - nvarchar 在存储过程中限制为 8000 个字符

sql-server - 在 ssis 包中使用的存储过程中使用 "Set NOCOUNT ON"有什么好处?

sql - 具有变更历史的数据库设计

sql - ROW_NUMBER() 性能优化

sql-server - SQL Server 是否支持通过路由测量距离?