出售域名 11365.com.cn
有需要请联系 16826375@qq.com
在手机上浏览
在手机上浏览

拨开@@ROWCOUNT的迷雾

发布日期:2020-09-30

在MSSQL中,@@ROWCOUNT忠实记录着-执行SQL语句-影响的行数。但在实际应用中可能会出点问题。比如

update cms_Tags set TagName='b1' where TagName='a1'
if(@@ROWCOUNT>0) 
begin
	print '更新'+cast(@@ROWCOUNT as varchar)+'条记录\r\n'
end

如果更新了1条记录,我们会认为@@ROWCOUNT=1,当然会打印出

“更新1条记录\r\n”

但实际情况并非如此,而是:

从图中可以看出,确实有一行受影响,而且的确进入了判断,打印出来文本,但为什么还是0呢?

我用一段增加语句来说明

insert into cms_Tags(TagName) select 'a1'
begin
print '增加'+cast(@@ROWCOUNT as varchar)+'条记录\r\n'
print '增加'+cast(@@ROWCOUNT as varchar)+'条记录\r\n'
end

可以看出,第一行显示是正确的,第二行就把@@ROWCOUNT重置了。

 

查看微软文档(https://docs.microsoft.com/zh-cn/sql/t-sql/functions/rowcount-transact-sql?view=sql-server-ver15)里面这样一句

USE、SET <option>、DEALLOCATE CURSOR、CLOSE CURSOR、PRINT、RAISERROR、BEGIN TRANSACTION 或 COMMIT TRANSACTION 等语句将 ROWCOUNT 值重置为 0。

 

如果改成select就不会重置了

declare @msg varchar(500)
set @msg=''

insert into cms_Tags(TagName) select 'a1'
begin
select @msg += '增加'+cast(@@ROWCOUNT as varchar)+'条记录'+CHAR(13)
select @msg += '增加'+cast(@@ROWCOUNT as varchar)+'条记录'
end

print @msg

显示结果如下:

综上所述得到结论,@@ROWCOUNT能得到上一句SQL执行影响的行数,并在执行下一条特定语句后重置为0!