• 蛙蛙推荐:使用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
  • 相关阅读:
    常用python机器学习库总结
    链接器link.exe 编译器cl.exe 资源编译器rc.exe
    LRESULT与wParam和lParam的问题
    CreateDialog和DialogBox
    如何通俗易懂地解释卷积?
    深度学习在graph上的使用
    一文弄懂神经网络中的反向传播法——BackPropagation
    WM_COMMAND消息
    win32编程中消息循环和WndProc()窗口过程函数
    使用UEditor 的时候,ajax注意使用同步的方法
  • 原文地址:https://www.cnblogs.com/onlytiancai/p/1364716.html
Copyright © 2020-2023  润新知