为何在完全隔离场景下执行@@ROWCOUNT查询返回结果为1?
问题结论
你猜测的完全正确,SELECT @@ROWCOUNT语句本身确实会触发@@ROWCOUNT的更新,返回1是完全符合官方规则的正常表现。
原因说明
根据微软官方对@@ROWCOUNT的定义,不带业务查询逻辑、仅返回固定值/系统函数/系统变量值的SELECT语句,执行后会自动将@@ROWCOUNT设置为1——这类语句本身会返回1行结果,哪怕结果行的内容是系统变量的值,也符合这个计数规则。
你遇到的测试现象都可以用这个规则解释:
- 无前置语句直接执行
SELECT @@ROWCOUNT时,这个语句本身执行时先将@@ROWCOUNT赋值为1,再返回该值,所以你拿到的结果就是1。 - 当你执行过其他业务语句(比如未命中任何行的UPDATE)后,
@@ROWCOUNT原本会被设为0,但只要你执行了一次读取@@ROWCOUNT的SELECT语句、或者用IF对@@ROWCOUNT做判断,这两个操作本身都会重置@@ROWCOUNT的值,所以后续读取会拿到符合当前操作的计数结果。
实用注意事项
如果需要准确捕获UPDATE、DELETE、INSERT这类业务操作的影响行数,必须紧挨着业务语句用本地变量把@@ROWCOUNT的值存下来,中间不能插入任何其他语句(包括IF判断、其他SELECT查询),否则@@ROWCOUNT会被后续语句重置,拿到错误的计数结果。
内容的提问来源于stack exchange,提问作者EvilDr
相关产品推荐
相关产品推荐

