如何根据 XML 参数更新表

2024-04-29

我有一个表,我想根据 XML 参数中的值更新其 varchar 字段之一。

我有下表:

ID  Constraint_Value
1   (OldVal_1) (OldVal_2)
2   (OldVal_2) (OldVal_1)

我想使用以下 XML 来更新Constraint_Value field:

<qaUpdates>
    <qaUpdate><old>OldVal_1</old><new>NewVal_1</new></qaUpdate>
    <qaUpdate><old>OldVal_2</old><new>NewVal_2</new></qaUpdate>
</qaUpdates>

更新后,我的目标如下:

ID    Constraint_Value
1     (NewVal_1) (NewVal_2)
2     (NewVal_2) (NewVal_1)

以下 SQL 说明了我的问题(无需任何设置即可在 SQL Management Studio 中运行):

IF OBJECT_ID('tempdb..#tmpConstraint') IS NOT NULL DROP TABLE #tmpConstraint
GO 

CREATE TABLE tempdb..#tmpConstraint ( constraint_id INT PRIMARY KEY, constraint_value varchar(256) )
GO

insert into #tmpConstraint
values (1, '(OldVal_1) (OldVal_2)')

insert into #tmpConstraint
values (2, '(OldVal_2) (OldVal_1)')

select * from #tmpConstraint

declare @myXML XML
set @myXML = N'<qaUpdates>
    <qaUpdate><old>OldVal_1</old><new>NewVal_1</new></qaUpdate>
    <qaUpdate><old>OldVal_2</old><new>NewVal_2</new></qaUpdate>
</qaUpdates>'

update c
set constraint_value = REPLACE(constraint_value, Child.value('(old)[1]', 'varchar(50)'), Child.value('(new)[1]', 'varchar(50)'))
from #tmpConstraint c
cross join @myXML.nodes('/qaUpdates/qaUpdate') as N(Child) 

select * from #tmpConstraint

这给出了结果:

(Before)
1   (OldVal_1) (OldVal_2)
2   (OldVal_2) (OldVal_1)

(After)
1   (NewVal_1) (OldVal_2)
2   (OldVal_2) (NewVal_1)

正如你所看到的OldVal_1已经升级。OldVal_2保持不变。

如何使用 xml 参数中指定的所有元素更新字段?


利用递归 cte 可以让我得到您正在寻找的结果。如下所示。但至少它不是游标/while循环;)

declare @tmpConstraint table (ID int , Constraint_Value varchar(256))
insert into @tmpConstraint values 
(1, '(OldVal_1) (OldVal_2)'),
(2, '(OldVal_2) (OldVal_1)')

declare @myXML XML
set @myXML = N'<qaUpdates>
    <qaUpdate><old>OldVal_1</old><new>NewVal_1</new></qaUpdate>
    <qaUpdate><old>OldVal_2</old><new>NewVal_2</new></qaUpdate>
</qaUpdates>'

declare @xmlData table (oldValue varchar(256), newValue varchar(256))
insert into @xmlData 
select 
    oldValue = Child.value('(old)[1]', 'varchar(50)'), 
    newValue = Child.value('(new)[1]', 'varchar(50)')
from @myXML.nodes('/qaUpdates/qaUpdate') as N(Child) 

上面只是为下面的设置。

;with cte (ID, Constraint_Value, CLevel)
as
(
    select c.ID, c.Constraint_Value, 1
    from @tmpConstraint c

    union all

    select p.ID, cast(replace(p.Constraint_Value, x.oldValue, x.newValue) as varchar(256)), p.CLevel + 1
    from cte p
    join @xmlData x on p.Constraint_Value like '%' + x.oldValue + '%'
)
update c
set c.Constraint_Value = t.Constraint_Value
from @tmpConstraint c
join (
    select 
        *,
        rn = row_number() over (partition by ID order by CLevel desc)
    from cte
) t on t.ID = c.ID and rn = 1

select * from @tmpConstraint
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据 XML 参数更新表 的相关文章

随机推荐

  • 如何进行不区分大小写的字符串比较?

    如何使下面的行不区分大小写 drUser Enrolled enrolledUsers FindIndex x gt x Username string drUser Username 1 今天早些时候我得到了一些建议 建议我使用 x Us
  • 将静态链接的 elf 二进制文件转换为动态链接的

    我有一个 elf 二进制文件 它已静态链接到 libc 我无权访问其 C 代码 我想使用 OpenOnload 库 它在用户空间中实现了套接字 因此与标准 libc 版本相比提供了更低的延迟 OpenOnload 实现标准套接字 api 并
  • CSS 网格行垂直溢出其容器

    我想在页面上有一个网格布局 其中网格延伸到整个视口 并且行具有最小高度 最简单的示例是具有单个单元格的网格 请参见下面的代码片段 我遇到的问题是 当视口的高度小于定义的最小行高时 该行垂直溢出其容器 通过在下面的示例中添加红色和绿色边框 可
  • iPhone 相机访问权限?

    我想知道如何访问 iPhone 相机并实时使用它 例如 仅在相机视图上绘图 另一个相关问题 可以显示吗同时 4 个摄像机视图就像 Mac 上的 Photo Booth 一样 您可以使用 AVFoundation 来做到这一点 void in
  • 从布伦特里汇款

    我使用 Braintree 作为我的网站的付款方式 收款时没问题 但现在我想将钱转入特定客户帐户 不退款 请帮我 谢谢你 Full disclosure I work at Braintree If you have any further
  • 如何让wildfly localhost连接自动变成https?

    我需要在本地主机上使用 https 协议测试我的 Web 应用程序 我怎样才能在wildfly上配置设置以使https localhost 8443 myapp html works New 我将其添加到我的安全领域
  • 使用 Google 地图对 geoJson 文件中的点进行自定义标记

    我使用 GeoJSON 作为 Google 地图的数据源 我使用 API v3 创建数据层 如下所示
  • Node.js 中的缓冲区是什么?

    正如您可以在有关 Buffer 类的 Node js 文档 http nodejs org api buffer html 一个缓冲区 类似于整数数组 但对应于 V8 堆外部的原始内存分配 到目前为止 一切都很好 现在让我困惑的是 从技术上
  • 查找其他列表项中列表项的列表索引

    我有一个长字符串列表 我想获取与另一个列表中的字符串子字符串匹配的列表元素的索引 使用列表理解可以轻松检查列表项是否包含列表中的单个字符串 例如这个问题 https stackoverflow com questions 4843158 c
  • AJAX 加载 WordPress 内容

    我一直在遵循 AJAX 教程来尝试将我的 WordPress 帖子内容加载到我网站的主页上 而无需重新加载页面 我不知道为什么 但是当单击链接时 它仍然导航到页面 而不是将内容加载到我指定的 div 中 不管怎样 这对我来说有点太多了 我希
  • [UIScreen mainScreen].bounds 与 [UIApplcation sharedApplication].keyWindow.bounds?

    我认为我想覆盖整个屏幕 我想将其框架设置为覆盖整个屏幕 浏览堆栈溢出 我发现设置视图框架覆盖屏幕的两种不同方法 UIScreen mainScreen bounds UIApplcation sharedApplication keyWin
  • 为什么 XDebug 忽略 NetBeans 6.8 中的断点?

    我在 Ubuntu 10 04 笔记本电脑上运行 PHP 5 3 2 Apache 2 2 14 和 xdebug 2 2 0rc1 并且尝试在 Netbeans 6 8 中的本地主机上设置调试 我的问题是我在 Netbeans 中设置的断
  • 尝试从 assetForURL:resultBlock 内部分配 __block ALAsset 时出错:

    我正在尝试创建一个方法 该方法将返回给定资产 url 的 ALAsset 我需要稍后上传资产 并希望在结果块之外执行此操作 ALAsset assetForPhoto Photo photo ALAssetsLibrary library
  • 如何在 NSUserDefaults 中存储 Swift 枚举值

    我有一个这样的枚举 enum Environment case Production case Staging case Dev 我想在 NSUserDefaults 中保存一个实例 如下所示 func saveEnvironment en
  • 如何使用 forEach 删除列表中的元素?

    var people alex jason matt people forEach function p if p length gt 4 REMOVE THIS PERSON or pop it out of the list or wh
  • 从恐慌中恢复的程序未按预期退出

    根据我的理解 当恐慌恢复时 我期望程序退出并表现出正常行为 但事实并非如此 我期望最后一行打印 程序结束 是正确的吗 如果出现运行时错误 它不会被打印 是吗 package main import fmt func main defer f
  • 最快的 SQL Server 协议?

    最快的 SQL Server 连接协议是什么 相关 哪些协议可以远程使用 哪些可以本地使用 这会影响最快协议的选择吗 VIA 这是最快的 SQL 协议 它在专用硬件上运行 并用于执行 SQL Server 基准测试记录 请注意 VIA 协议
  • 从 Spark-Shell (pyspark) 查询 Spark 流应用程序

    我正在关注这个example http cdn2 hubspot net hubfs 438089 notebooks spark2 0 Structured 20Streaming 20using 20Python 20DataFrame
  • 将 CVS 升级到 git/hg 的技巧?

    我们仍然使用 CVS 我使用 git 和 hg 供我个人使用 尽管我对这两个工具仍然是新手 但我意识到它们更现代 更好 更快 分布式等 只是每个人都如此习惯 CVS 以至于我觉得如果我是推荐并实际将我们当前的 CVS 服务器升级 移植 转换
  • 如何根据 XML 参数更新表

    我有一个表 我想根据 XML 参数中的值更新其 varchar 字段之一 我有下表 ID Constraint Value 1 OldVal 1 OldVal 2 2 OldVal 2 OldVal 1 我想使用以下 XML 来更新Cons