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。可惜意发生了:

temp_upload_rowcount.png

查 MSSQL 文档,有如下说明:

Statements such as USE, SET <option>, DEALLOCATE CURSOR, CLOSE CURSOR, PRINT, RAISERROR, BEGIN TRANSACTION, or COMMIT TRANSACTION reset the ROWCOUNT value to 0.

并没提到 IF 语句也会将 @@ROWCOUNT 重置为 0,但根据以上测试 IF 应该也属于这种情况。

那如何改进以上脚本呢:

  • 将上述第二个 IF 改为 ELSE IF,这样@@ROWCOUNT 就不会被重置
  • 及时将@@ROWCOUNT用本地变量存起来(这是适用于大多数情况的做法)