核心特性
- 返回**上一條 T-SQL 語句影響的行數**
- 每條語句執行後自動重置(含 SET、IF、PRINT 等)
- 不返回行的語句(DDL、變量賦值、流程控制)將其置 0
- 類似
@@ERROR,屬語句級上下文變量
經典陷阱演示
DECLARE @RowCountVar INT;
UPDATE AF_CarOil SET OilType = '五號汽油'; -- 假設影響 2 行
-- 此時 @@ROWCOUNT = 2
SET @RowCountVar = @@ROWCOUNT; -- 賦值語句本身影響 1 行
-- 此時 @@ROWCOUNT = 1 !已被重置
IF @@ROWCOUNT = 1 -- 判斷的是 SET 語句的影響行數,而非 UPDATE
BEGIN
PRINT '影響的行數為 1';
PRINT @@ROWCOUNT; -- 輸出 0(PRINT 後重置)
END
IF @RowCountVar <> 0 -- 正確:使用保存的局部變量
BEGIN
PRINT '受影響的行數為:' + STR(@RowCountVar); -- 輸出 2
END
輸出結果
(2 行受影響)
影響的行數為 1
0
受影響的行數為: 2
最佳實踐模式
-- 1. 緊跟目標語句立即保存
UPDATE tbl SET col = val WHERE id = @id;
DECLARE @affected INT = @@ROWCOUNT; -- 同一批次或緊鄰語句
-- 2. 邏輯判斷用局部變量
IF @affected = 0
BEGIN
RAISERROR('無數據更新', 16, 1);
RETURN;
END
-- 3. 多語句事務中每條關鍵操作後保存
BEGIN TRAN;
INSERT ...; SET @ins = @@ROWCOUNT;
UPDATE ...; SET @upd = @@ROWCOUNT;
DELETE ...; SET @del = @@ROWCOUNT;
COMMIT;
-- 4. 觸發器中判斷操作類型
CREATE TRIGGER tr_tbl ON tbl AFTER INSERT, UPDATE, DELETE
AS
BEGIN
IF @@ROWCOUNT = 0 RETURN;
IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
PRINT 'UPDATE';
ELSE IF EXISTS(SELECT * FROM inserted)
PRINT 'INSERT';
ELSE
PRINT 'DELETE';
END
對比:@@ROWCOUNT vs ROWCOUNT_BIG()
| 特性 | @@ROWCOUNT | ROWCOUNT_BIG() |
| 返回類型 | INT (最大 21 億) | BIGINT (922 兆) |
| 適用場景 | 常規 DML | 大批量操作(>21 億行) |
| 重置行為 | 同 | 同 |
常見誤區
- 以為 IF 不重置 @@ROWCOUNT:任何語句包括 IF/WHILE/PRINT/SET 都會重置
- 跨批次引用:GO 批次分隔符後 @@ROWCOUNT 歸 0
- 動態 SQL 中引用:
EXEC(@sql); SELECT @@ROWCOUNT 返回 EXEC 本身影響行數(通常 0),而非動態 SQL 內部行數 → 需在動態 SQL 內部用 OUTPUT 參數返回