使用XML字段批量更新數(shù)據(jù)庫(kù) 收藏
摘要:有時(shí)候我們想根據(jù)不同的where條件更新多條記錄,一般就需要用多條語(yǔ)句,本文教你怎樣用一次查詢(xún)完成,但XML處理會(huì)讓數(shù)據(jù)庫(kù)進(jìn)程CPU升高,請(qǐng)酌情使用。
--1、初始化臨時(shí)表及原始數(shù)據(jù)
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、準(zhǔn)備批量更新的XML
DECLARE @a TABLE(data XML)
INSERT @a SELECT '
<root>
<i k=''a'' v=''3'' />
<i k=''b'' v=''4'' />
</root>'
--3、將表變量a輸出到一個(gè)臨時(shí)結(jié)果集,并用來(lái)和原始表#t join后更改原始表
--這里用到了帶有from子句的update語(yǔ)句和cte類(lèi)型
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的結(jié)果集應(yīng)該如下
--k v
--a-3
--b-4
--4、驗(yàn)證原始表是否已經(jīng)修改
select * from #t
--輸出如下
--k v
--a-3
--b-4
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。