蛙蛙推荐:使用XML字段批量更新数据库
摘要:有时候我们想根据不同的where条件更新多条记录,一般就需要用多条语句,本文教你怎样用一次查询完成,但XML处理会让数据库进程CPU升高,请酌情使用。
--1、初始化临时表及原始数据
if object_id('tempdb..#t') is not null
drop table #t
if object_id('tempdb..#t2') is not null
drop table #t2
create table #t(k varchar(100),v int)
insert into #t values('a',1)
insert into #t values('b',2)
select * from #t
--输出如下
--k v
--a-1
--b-2
--2、准备批量更新的XML
DECLARE @a TABLE(data XML)
INSERT @a SELECT '
<root>
<i k=''a'' v=''3'' />
<i k=''b'' v=''4'' />
</root>'
--3、将表变量a输出到一个临时结果集,并用来和原始表#t join后更改原始表
--这里用到了带有from子句的update语句和cte类型
update #t set #t.v = d.v
from #t inner join (
SELECT b.id k,c.id v FROM @a a
CROSS APPLY
(
SELECT id = t.x.value('@k','varchar(100)') FROM a.data.nodes('//i') AS t(x)
) b
CROSS APPLY
(
SELECT id = t2.x.value('@v','int')
FROM a.data.nodes('//i') AS t2(x)
where t2.x.value('@k','varchar(100)') = b.id
) c
) as d
on #t.k = d.k
--其中cte d的结果集应该如下
--k v
--a-3
--b-4
--4、验证原始表是否已经修改
select * from #t
--输出如下
--k v
--a-3
--b-4
if object_id('tempdb..#t') is not null
drop table #t
if object_id('tempdb..#t2') is not null
drop table #t2
create table #t(k varchar(100),v int)
insert into #t values('a',1)
insert into #t values('b',2)
select * from #t
--输出如下
--k v
--a-1
--b-2
--2、准备批量更新的XML
DECLARE @a TABLE(data XML)
INSERT @a SELECT '
<root>
<i k=''a'' v=''3'' />
<i k=''b'' v=''4'' />
</root>'
--3、将表变量a输出到一个临时结果集,并用来和原始表#t join后更改原始表
--这里用到了带有from子句的update语句和cte类型
update #t set #t.v = d.v
from #t inner join (
SELECT b.id k,c.id v FROM @a a
CROSS APPLY
(
SELECT id = t.x.value('@k','varchar(100)') FROM a.data.nodes('//i') AS t(x)
) b
CROSS APPLY
(
SELECT id = t2.x.value('@v','int')
FROM a.data.nodes('//i') AS t2(x)
where t2.x.value('@k','varchar(100)') = b.id
) c
) as d
on #t.k = d.k
--其中cte d的结果集应该如下
--k v
--a-3
--b-4
--4、验证原始表是否已经修改
select * from #t
--输出如下
--k v
--a-3
--b-4
分类:
综合区
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构