IF语句会将@@ROWCOUNT重置为0
最近遇到一个关于全局变量 @@ROWCOUNT 的值意外变化的问题,代码逻辑是根据不同条件执行不同的 SELECT 语句,然后记录返回行数,大致代码如下:
DECLARE @type VARCHAR(20) = 'A'
IF @type = 'A'
BEGIN
SELECT TOP 1 * FROM sys.tables
END
IF @type = 'B'
BEGIN
SELECT TOP 2 * FROM sys.tables
END
SELECT @@ROWCOUNT AS row_count
按正常想法,@@ROWCOUNT的值应该是满足条件时所执行的 SELECT 语句返回的行数,所以上述代码@@ROWCOUNT的值应为 1。可惜意发生了:

查 MSSQL 文档,有如下说明:
Statements such as
USE,SET <option>,DEALLOCATE CURSOR,CLOSE CURSOR,RAISERROR,BEGIN TRANSACTION, orCOMMIT TRANSACTIONreset theROWCOUNTvalue to 0.
并没提到 IF 语句也会将 @@ROWCOUNT 重置为 0,但根据以上测试 IF 应该也属于这种情况。
那如何改进以上脚本呢:
- 将上述第二个
IF改为ELSE IF,这样@@ROWCOUNT 就不会被重置 - 及时将@@ROWCOUNT用本地变量存起来(这是适用于大多数情况的做法)