You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程中@@ROWCOUNT赋值变量异常问题求助

解决SQL Server存储过程返回@@ROWCOUNT始终为1的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是@@ROWCOUNT的特性——它会被每一条T-SQL语句自动更新,包括你用来判断的IF语句本身。

问题根源

当你的查询语句返回结果后,@@ROWCOUNT确实是正确的行数,但紧接着执行的IF @@ROWCOUNT = 0这条语句,会把@@ROWCOUNT的值重置为1(因为IF语句本身是一个成功执行的操作,它的行计数是1)。所以当你在ELSE分支里再读取@@ROWCOUNT时,拿到的已经不是原来查询的行数,而是IF语句的行计数1了。

修正方案

解决办法很简单:在查询语句执行后,立刻把@@ROWCOUNT的值保存到一个局部变量里,之后的判断和赋值都用这个变量,就不会被后续语句干扰了。

修正后的完整代码

-- Add the parameters for the stored procedure here
@LoginName VARCHAR(25),
@Password VARCHAR(10),
@rowsAffected INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @PasswordSalt VARCHAR(36)
    DECLARE @actualRowCount INT -- 新增局部变量保存行计数

    SELECT @PasswordSalt = PasswordSalt FROM Employee WHERE LoginName = @LoginName -- 简化原写法
    SELECT Employee.ID, FirstName, LastName, LoginName, Email, StatusTypeID, Description AS StatusDescription
    FROM Employee
    JOIN StatusType st ON Employee.StatusTypeID = st.ID
    WHERE LoginName = @LoginName
    AND PasswordHash = HashBytes('SHA2_512', @Password + Cast(@PasswordSalt AS nvarchar(36)))
    AND StatusTypeID = 1

    SET @actualRowCount = @@ROWCOUNT -- 立刻保存查询的行计数

    IF @actualRowCount = 0
    BEGIN
        SET @rowsAffected = -1
    END
    ELSE
    BEGIN
        SET @rowsAffected = @actualRowCount -- 使用保存的变量赋值
    END
END

额外小提示

  • 我把SELECT @PasswordSalt = (SELECT PasswordSalt FROM Employee WHERE LoginName = @LoginName)简化成了SELECT @PasswordSalt = PasswordSalt FROM Employee WHERE LoginName = @LoginName,两者效果完全一致,写法更简洁。
  • 保持SET NOCOUNT ON开启是个好习惯,能避免返回额外的行计数消息干扰应用程序的处理逻辑。

内容的提问来源于stack exchange,提问作者Nicole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:03:08