• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
netcore_vue
博客园    首页    新随笔    联系   管理    订阅  订阅

sqlserver批量更新操作,有要注意的地方留心

如果针对某个表中数据要进行批量更新,由于是客户的正式库一定要小心操作。

在批量更新前可以做下该表的备份,可应用SELECT INTO FROM语句来插入一个新表当中

SELECT value1, value2 into Table_2 from Table_1

说明:要求目标表Table_2不存在,因为在插入时会自动创建表Table_2

另外,还可以应用INSERT INTO SELECT语句

Insert into Table2(field1,field2,…) select value1,value2,… from Table1

或

Insert into Table2 select * from Table1

说明:

(1)Table2必须存在,并且字段field,"field2…也必须存在;

(2)如果Table2有主键而且不为空,并且没有设置自增长,则","field1," "field2…中必须包括主键;

(3)不要和插入一条数据的sql混了,不要写成: 

Insert into Table2(field1,field2,…) values (select value1,value2,… from Table1)

(4)field与value的数据类型要对应上;

进入正文,批量更新的两种方式,如下。

第一种

左连接方法,即left join

update 表1
SET 表1.CnasDate=t1.日期
FROM (select 日期,Id from 表2) as t1
left join 表1 as t2
ON t1.Id=t2.ID

注意:left join后面的“表1” 就只限定数据库表名就行,不要去给表1加上一些查询条件(类似表2那样),那样会导致批量更新失效,将整个表的数据全给更新了,如果没有备份就BABIQ了,而我们要更新只是部分数据,要理解left join的含义,左连接就是以左边查询的表数据行数为准,返回左表的所有数据,即使右表中没有匹配的行!

第二种,比较简洁

update
表一
set
表一的字段= 表2的字段
from
表一,
表二
where
表一.Id = 表二.Id

示例

UPDATE a 
SET a.RealityNumber = b.Qty 
FROM
    ( SELECT * FROM 表1 WHERE Version = '202206' AND BillNum = 'BT20220801021701 ' ) a,
    ( SELECT * FROM 表2 WHERE Version = '202206' AND BillNum = 'BT20220801021701 ' ) b 
WHERE
    a.id = b.id

说明:此方式和第一种,不同之外有一个就是针对表1可以加上限制的查询条件。

改为第一种方式

UPDATE 表1
SET 表1.RealityNumber= a.Qty 
FROM
    ( SELECT * FROM 表2 WHERE Version = '202206' AND BillNum = 'BT20220801021701 ' ) a
    LEFT JOIN 表1 b ON a.Id= b.Id

还是要提醒一下,上述代码中表1不要加上任何限制条件。

posted @ 2022-08-10 10:39  梦想代码-0431  阅读(2239)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3