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
相关产品推荐
相关产品推荐

