ROWCOUNT到底是什么玩意儿?
这货在SQL里就是个计数器,专门记录你上条语句动了多少行数据。比如你删了5条记录,@@ROWCOUNT立马变成5;要是更新了3行,它就显示3。但千万注意:它只认最后一条语句!假如连着执行两条UPDATE,它只记第二条的改动数。实际开发中常这么用:

UPDATE 订单 SET 状态='已发货' WHERE 日期 0
PRINT '成功更新订单状态';
很多新手会误以为它能统计事务总量,结果掉坑里——其实它只对当前批处理的最后操作有效。
批量操作的黄金搭档
当你要处理百万级数据时,直接跑全表更新等于自杀。这时用SET ROWCOUNT设定分批处理量能救命:
SET ROWCOUNT 1000 -
每批只动1000行
WHILE 1=1
BEGIN
DELETE TOP (1000) FROM 日志表 WHERE 创建时间<'2022-01-01'
IF @@ROWCOUNT = 0 BREAK
END
SET ROWCOUNT 0 -
记得关闭!
这招比用TOP更灵活,尤其配合循环时能避免锁表超时。某电商平台用这方法把日志清理时间从8小时压到20分钟,DBA头发都少掉几根。
存储过程里的隐形裁判
写存储过程时,@@ROWCOUNT能当流程控制器。比如转账场景:
BEGIN TRANSACTION
UPDATE 账户 SET 余额=余额-100 WHERE 用户ID=123
IF @@ROWCOUNT = 0 -
检测是否更新成功
BEGIN
ROLLBACK
RETURN -1
END
COMMIT
这里它比检查@@ERROR更精准,毕竟没动到数据行可能比报错更危险。银行系统最爱用这招防幽灵账户操作。
分页查询的冷门技巧
虽然现在OFFSET-FETCH是分页正统,但老系统里用ROWCOUNT玩分页依然常见:
SET ROWCOUNT 10 -
每页10条
SELECT * FROM 产品表
WHERE ID > @lastID
ORDER BY ID
配合记录最后ID实现高效翻页。不过要注意:必须严格排序!某论坛系统曾因漏写ORDER BY导致用户看到重复帖子,被喷上热搜。
触发器中的天坑预警
在触发器里用@@ROWCOUNT?简直是扫雷游戏!看这个例子:
CREATE TRIGGER 审计删除
ON 订单表 AFTER DELETE
AS
IF @@ROWCOUNT > 5
RAISERROR('禁止批量删单',16,1)
看着能防误删?错!如果有人分6次各删1单,触发器根本不报错。正确做法是检查deleted表的行数,别被@@ROWCOUNT坑哭。
现代SQL的替代方案
SQL Server 2012后更推荐用TOP/LIMIT+变量替代:
| 老方法 | 新方法 | 优势 |
|---|---|---|
| SET ROWCOUNT 100 | DECLARE @batch INT=100 | 避免全局影响,更可控 |
| UPDATE … | DELETE TOP(@batch) … |
但@@ROWCOUNT仍有不可替代性——它永远实时反馈操作结果。某物流系统升级时试图全面替换ROWCOUNT,结果库存校验模块崩了,连夜回滚版本。
跨数据库的兼容性雷区
不同数据库对这玩意的实现千奇百怪:
- MySQL用ROW_COUNT函数,必须单独调用
- Oracle靠SQL%ROWCOUNT,作用域限于当前PL/SQL块
- PostgreSQL直接没有全局变量,得用GET DIAGNOSTICS
最近有个项目从SQL Server迁移到PostgreSQL,程序员忘了改@@ROWCOUNT,直接导致对账程序吞掉错误数据,财务差点提刀砍人。
内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。
本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/150283.html