有时需要运用 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
表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,第 6 行
COMMIT 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如图,完全相同: