sqlserver transact-sql UPDATE tran 用事务处理更新语句

有时需要运用 transact-sql 直接进行一些 UPDATE ,并且此次update正确影响的行数我们是知道的,为了能够确保update所影响的行数达到我们的预期,如果不符,需要回滚此次更新,故,需要用到sqlserver的tran

建表,A,B

create table A
(
姓名 nvarchar(20),
课程 nvarchar(20)
)
create table B 
(
姓名 nvarchar(20),
课程 nvarchar(20)
)

插入数据

INSERT INTO A(姓名,课程) VALUES ('小明','数学'),('小红','物理'),('小王','语文')
INSERT INTO B(姓名,课程) VALUES ('小明','数学'),('小红','生物'),('小王','地理')

可见结果:
表A
表A
表B
表B
现需按照相同姓名,并且课程不同的,将B的课程更新到与A相同

BEGIN TRAN
UPDATE A 
SET A.课程=B.课程
FROM B WHERE A.姓名=B.姓名 AND A.课程<>B.课程
IF @@ROWCOUNT<>3 BEGIN ROLLBACK END
COMMIT 

sqlserver 返回结果:

(2 行受影响)
消息 3902,级别 16,状态 1,第 6COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION

@@ROWCOUNT为UPDATE的受影响行数
因该语句,受影响行数=2,不等于3,故会进行ROLLBACK,不会执行成功.

正确的SQL语句:

BEGIN TRAN
UPDATE A 
SET A.课程=B.课程
FROM B WHERE A.姓名=B.姓名 AND A.课程<>B.课程
IF @@ROWCOUNT<>2 BEGIN ROLLBACK END
COMMIT 

执行结果,A,B如图,完全相同:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值